cURL: como suprimir saída estranha ao redirecionar?


67

Estou tentando imprimir apenas as seções detalhadas de uma solicitação cURL (que são enviadas para stderr) a partir do shell bash.

Mas quando eu redireciono stdoutassim:

curl -v http://somehost/somepage > /dev/null

Algum tipo de tabela de resultados aparece no meio da saída para stderr:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

Seguido por isso perto do fim:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

O que torna os cabeçalhos de resposta menos legíveis.

Não vejo este texto quando não estou redirecionando.


Outra maneira de ver os efeitos:

A tabela não aparece:

curl -v http://somehost/somepage 2>&1

A tabela aparece:

curl -v http://somehost/somepage 2>&1 | cat

1) Como é que isso aparece apenas com certos tipos de redirecionamentos?

2) Qual a melhor maneira de suprimi-lo?

Obrigado

Respostas:


60

Tente o seguinte:

curl -vs -o /dev/null http://somehost/somepage 2>&1

Isso irá suprimir o medidor de progresso, enviar stdoutpara /dev/nulle redirecionamento stderr(a -vsaída) para stdout.


32
Obrigado, -sfoi a chave!
11268 Ian Ianinninnon

6
@IanMackinnon Observe que, com -smas sem -vvocê, você não verá erros como falha na conexão. Para isso, você também deve adicionar -S(ou --show-error) como na resposta de mhoydis.
Artyom

mas por que a barra de progresso aparece apenas em primeiro lugar ao redirecionar? Corri para esse mesmo problema ao canalizar a saída de curlpara jq. Nenhuma barra de progresso sem canalizar para jq, então, ao canalizar jq, tenho que voltar e adicionar -s.
sixty4bit 29/07

@ sixty4bit: Essa é uma escolha de design que os desenvolvedores fizeram. O programa pode detectar quando STDOUTnão é um tty. Quando a saída não está sendo canalizada, você não deseja que as informações de progresso sejam intercaladas com a saída normal, que você pode ver e ter alguma idéia do progresso. Quando a saída é redirecionada ou canalizada, você não pode vê-la para não ter um medidor de progresso - a menos que a barra de progresso esteja ativada.
Dennis Williamson

23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

Isso suprimirá a caixa de diálogo de status, mas gerará erros no STDERR.

user@host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

O exemplo acima gera a tabela de status ao redirecionar.

user@host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

O item acima suprime a tabela de status ao redirecionar, mas os erros ainda continuarão no STDERR.

user@host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve host 'www.errorexample.com'

O exemplo acima é um exemplo de erro para STDERR.

user@host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'www.errorexample.com'

Basta adicionar 2> & 1 ao final para redirecionar STDERR para STDOUT (neste caso, para um arquivo).


5

De acordo com man curl:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

Exemplo de uso:

curl -s 'http://www.google.com'

ou se você deseja capturar o HTTP-BODY em uma variável no bash

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

Você pode usar -sou --silentalternadamente.


4

Com referência à pergunta 1 ( como o cURL sabe exibir apenas a tabela quando a saída é redirecionada), não percebi que um programa poderia dizer que suas saídas estavam sendo direcionadas, mas parece que nos sistemas POSIX existe uma função isattyque informa se deve ou não um descritor de arquivo refere-se a um terminal.


2
Aqui está um trecho do Bash:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
Dennis Williamson

2

1) Como é que isso aparece apenas com certos tipos de redirecionamentos?

na página do manual curl

Se você deseja um medidor de progresso para solicitações HTTP POST ou PUT, é necessário redirecionar a saída de resposta para um arquivo, usando o redirecionamento de shell (>), -o [arquivo] ou semelhante.

o curl deve usar isatty para determinar o redirecionamento e imprimir o medidor de progresso quando redirecionado para um arquivo ou canal de shell.

2) Qual a melhor maneira de suprimi-lo?

na página do manual curl

-s, --silent

Modo silencioso ou silencioso. Não mostre medidor de progresso ou mensagens de erro. Faz o Onda ficar mudo. Ele ainda emitirá os dados solicitados, potencialmente até para o terminal / stdout, a menos que você o redirecione.


1

Para colocar mensagens de erro reais em algum lugar, você deve escrever strerr em um arquivo de log. Algo parecido:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.