Como faço para canalizar ou redirecionar a saída de curl -v?
117
Por alguma razão, a saída sempre é impressa no terminal, independentemente de eu redirecioná-la via 2> ou> ou |. Existe alguma forma de contornar isto? Por que isso está acontecendo?
Se eu fizer isso curl -v url 2>&1, os erros serão redirecionados corretamente para a saída padrão para mim.
Josh Lee,
Respostas:
134
adicione a -sopção (silencioso) para remover o medidor de progresso, então redirecione stderr para stdout para obter saída detalhada no mesmo fd que o corpo da resposta
Isso funciona para a maioria dos sites, mas por algum motivo o servidor local em minha máquina ainda imprime a saída completa, mesmo se eu fizer `2> & 1 | grep asdfasdfasdfasdfdfs` ou algo parecido. A saída completa, incluindo cabeçalhos, ainda é exibida no console. Existe algum outro fluxo que eu possa canalizar em grep para extrair alguns dados de que preciso?
jonderry,
Quais informações você está realmente tentando extrair e quais informações deseja descartar. Entendi que sua pergunta significa que você deseja que toda a saída de -v seja direcionada para stdout.
SingleNegationElimination
Eu quero processar alguns dos cookies (basicamente grep algumas informações dos cookies e fazer outras coisas). Sim, quero que tudo saia do padrão, para que possa processar o que quiser por meio de tubos. Atualmente, parte da saída apenas é exibida no console e parece impossível de redirecionar e não tenho certeza do porquê.
jonderry,
Você pode postar uma captura de tela da saída que aparece na tela que você deseja capturar? Não sei que tipo de saída você pode estar vendo e que pode passar despercebida 2>&1.
SingleNegationElimination
É o mesmo tipo de saída de qualquer outro site. A única diferença é que o servidor está rodando localmente. Existe alguma maneira de algum programa imprimir no console, mas não ter esse texto capturado por stout / sterr?
jonderry
115
Seu URL provavelmente contém "e" comercial. Eu tive esse problema também, e percebi que minha URL estava cheia de "e" comercial (de variáveis CGI sendo passadas) e então tudo estava sendo enviado para segundo plano de uma forma estranha e, portanto, não redirecionando corretamente. Se você colocar aspas em torno do URL, ele o corrigirá.
Eu tive o mesmo problema. Não há necessidade de 2> e 1 para que eu possa manter a saída e o registro de conexão separados. Obrigado roadnottaken.
quornian,
3
Amo o Stack-O ... Encontrei esse q e a menção do "e" comercial na URL. Ele colocou aspas ao redor do meu e o problema foi resolvido.
Paulb
2
As citações funcionaram para mim. Eu senti como se o curl estivesse executando em outras threads. Muito obrigado !
vdolez,
1
Tive que pesquisar na web por cinco minutos antes de você salvar minha noite :)
Shautieh
Jesus, que inseto terrível no curl - pelo menos deveria falhar ou dar um aviso. Sua resposta de 2012 me ajudou em 2018. Levei 30 minutos para resolver isso até que encontrei sua resposta. Obrigado!
Mauvis Ledford
29
A resposta acima não funcionou para mim, o que acabou funcionando foi esta sintaxe:
curl https://${URL} &> /dev/stdout | tee -a ${LOG}
tee coloca a saída na tela, mas também a anexa ao meu log.
Achei a mesma coisa: o curl por si só imprimiria em STDOUT, mas não poderia ser canalizado para outro programa.
No início, pensei que tinha resolvido usando xargs para ecoar a saída primeiro:
curl -s ... <url> | xargs -0 echo | ...
Mas então, conforme apontado nos comentários, ele também funciona sem a parte xargs, portanto -s(modo silencioso) é a chave para evitar a saída de progresso estranho para STDOUT:
Este exemplo simples mostra como capturar a saída curl e usá-la em um script bash
test.sh
function main
{
\curl -vs 'http://google.com' 2>&1
# note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file.
}
# capture output of curl to a variable
OUT=$(main)
# search output for something using grep.
echo
echo "$OUT" | grep 302
echo
echo "$OUT" | grep title
curl -v url 2>&1
, os erros serão redirecionados corretamente para a saída padrão para mim.Respostas:
adicione a
-s
opção (silencioso) para remover o medidor de progresso, então redirecione stderr para stdout para obter saída detalhada no mesmo fd que o corpo da respostafonte
2>&1
.Seu URL provavelmente contém "e" comercial. Eu tive esse problema também, e percebi que minha URL estava cheia de "e" comercial (de variáveis CGI sendo passadas) e então tudo estava sendo enviado para segundo plano de uma forma estranha e, portanto, não redirecionando corretamente. Se você colocar aspas em torno do URL, ele o corrigirá.
fonte
A resposta acima não funcionou para mim, o que acabou funcionando foi esta sintaxe:
curl https://${URL} &> /dev/stdout | tee -a ${LOG}
tee coloca a saída na tela, mas também a anexa ao meu log.
fonte
&> /dev/stdout
era definitivamente a parte que faltava, obrigadoSe precisar da saída em um arquivo, você pode usar um redirecionamento:
Certifique-se de não inverter o
>curl-output.txt
e2>&1
, o que não funcionará devido ao comportamento de redirecionamento do bash .fonte
Achei a mesma coisa: o curl por si só imprimiria em STDOUT, mas não poderia ser canalizado para outro programa.
No início, pensei que tinha resolvido usando xargs para ecoar a saída primeiro:
Mas então, conforme apontado nos comentários, ele também funciona sem a parte xargs, portanto
-s
(modo silencioso) é a chave para evitar a saída de progresso estranho para STDOUT:O exemplo acima captura o
<sometag>
conteúdo simples (sem tags incorporadas) da saída XML da instrução curl.fonte
Apenas meus 2 centavos. O comando abaixo deve resolver o problema, conforme respondido anteriormente
No entanto, se precisar obter a saída para um arquivo,
Deveria trabalhar.
fonte
O seguinte funcionou para mim:
Coloque sua instrução curl em um script chamado
abc.sh
Agora execute:
Você obterá os resultados do seu curl
stdout_output
e as informações de progresso emstderr_output
.fonte
Este exemplo simples mostra como capturar a saída curl e usá-la em um script bash
test.sh
fonte