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 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 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
-s
foi a chave!-s
mas sem-v
você, 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.curl
parajq
. Nenhuma barra de progresso sem canalizar parajq
, então, ao canalizarjq
, tenho que voltar e adicionar-s
.STDOUT
nã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.Isso suprimirá a caixa de diálogo de status, mas gerará erros no STDERR.
O exemplo acima gera a tabela de status ao redirecionar.
O item acima suprime a tabela de status ao redirecionar, mas os erros ainda continuarão no STDERR.
O exemplo acima é um exemplo de erro para STDERR.
Basta adicionar 2> & 1 ao final para redirecionar STDERR para STDOUT (neste caso, para um arquivo).
fonte
De acordo com
man curl
:Exemplo de uso:
ou se você deseja capturar o HTTP-BODY em uma variável no bash
Você pode usar
-s
ou--silent
alternadamente.fonte
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
isatty
que informa se deve ou não um descritor de arquivo refere-se a um terminal.fonte
[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
na página do manual curl
o curl deve usar isatty para determinar o redirecionamento e imprimir o medidor de progresso quando redirecionado para um arquivo ou canal de shell.
na página do manual curl
fonte
Para colocar mensagens de erro reais em algum lugar, você deve escrever strerr em um arquivo de log. Algo parecido:
fonte
Por trás de um proxy, uso um comando como este.
date -s "$ (curl --proxy http: // PROXY: 8080 -s http://google.com --head -s | grep Data | sed 's / Data: // g')"
fonte