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
.
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
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).
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.
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.
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
1) How come this shows up only with certain types of redirects?
da página man de curl
OIf 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.
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 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') "
Tags bash pipe curl redirection stderr