cURL: como suprimir saída estranha ao redirecionar?

50

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

Mas quando eu redirecionar stdout assim:

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 final:

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

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

Eu 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) Por que isso aparece apenas com certos tipos de redirecionamento?

2) Qual é a melhor maneira de suprimi-lo?

Obrigado

    
por Ian Mackinnon 07.08.2010 / 19:32

7 respostas

49

Tente isto:

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

Isso suprimirá o medidor de progresso, enviará stdout para /dev/null e redirecionará stderr (a -v output) para stdout .

    
por 07.08.2010 / 19:44
18
curl --fail --silent --show-error http://www.example.com/ > /dev/null

Isso suprimirá a caixa de diálogo de status, mas, caso contrário, 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

A saída acima da tabela de status ao redirecionar.

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

O texto acima suprime a tabela de status ao redirecionar, mas os erros ainda irão para STDERR.

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

O acima é um exemplo de um 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).

    
por 26.12.2013 / 23:06
4

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

    
por 07.08.2010 / 20:05
4

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ê quiser capturar o HTTP-BODY em uma variável no bash

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

Você pode usar -s ou --silent de maneira intercambiável.

    
por 20.09.2016 / 18:06
1

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

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
    
por 10.07.2012 / 18:16
1

1) How come this shows up only with certain types of redirects?

da página man de curl

If you want a progress meter for HTTP POST or PUT requests, you need to redirect the response output to a file, using shell redirect (>), -o [file] or similar.

O

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

2) What's the neatest way to suppress it?

da página man de curl

-s, --silent

Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute. It will still output the data you ask for, potentially even to the terminal/stdout unless you redirect it.

    
por 04.01.2017 / 19:16
0

Por trás de um proxy eu uso um comando como esse.

date -s "$ (curl --proxy link -s link --head -s | grep Data | sed 's / Data: // g') "     

por 07.07.2017 / 03:48