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?


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

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á.


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.


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 .


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.


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.


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.


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 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.