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?

Jonderry
fonte
3
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

curl -vs google.com 2>&1 | less
SingleNegationElimination
fonte
3
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á.

estrada não tomada
fonte
1
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.

Amir Mehler
fonte
1
&> /dev/stdoutera definitivamente a parte que faltava, obrigado
mattspain
10

Se precisar da saída em um arquivo, você pode usar um redirecionamento:

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

Certifique-se de não inverter o >curl-output.txte 2>&1, o que não funcionará devido ao comportamento de redirecionamento do bash .

panéter
fonte
3

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:

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

O exemplo acima captura o <sometag>conteúdo simples (sem tags incorporadas) da saída XML da instrução curl.

Brent Faust
fonte
2
em seus exemplos o 'xargs -0 echo |' é desnecessário. Contanto que você tenha 'curl -s', você pode canalizar a saída para outro programa.
Ryan Horrisberger
1

Apenas meus 2 centavos. O comando abaixo deve resolver o problema, conforme respondido anteriormente

curl -vs google.com 2>&1

No entanto, se precisar obter a saída para um arquivo,

curl -vs google.com > out.txt 2>&1

Deveria trabalhar.

Thulasiram Gopalakrishna
fonte
1
Isso não adiciona nenhum valor real à resposta aceita de 2011. Se houver alguma coisa, este poderia ser um comentário a essa resposta.
trincot de
0

O seguinte funcionou para mim:

Coloque sua instrução curl em um script chamado abc.sh

Agora execute:

sh abc.sh 1>stdout_output 2>stderr_output

Você obterá os resultados do seu curl stdout_outpute as informações de progresso em stderr_output.

amit
fonte
0

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 
Brad Parks
fonte