Come reindirizzo o reindirizzo l'output di curl -v?


117

Per qualche motivo l'output viene sempre stampato sul terminale, indipendentemente dal fatto che lo reindirizzi tramite 2> o> o |. C'è un modo per aggirare questo problema? Perché sta succedendo?


3
Se lo faccio curl -v url 2>&1, gli errori vengono reindirizzati correttamente allo standard output per me.
Josh Lee

Risposte:


134

aggiungi l' -sopzione (silenziosa) per rimuovere l'indicatore di avanzamento, quindi reindirizza stderr a stdout per ottenere un output dettagliato sullo stesso fd del corpo della risposta

curl -vs google.com 2>&1 | less

3
Funziona per la maggior parte dei siti Web, ma per qualche motivo il server locale sulla mia macchina stampa ancora l'intero output, anche se faccio `2> & 1 | grep asdfasdfasdfasdfdfs` o qualcosa del genere. L'output completo, comprese le intestazioni, è ancora visualizzato sulla console. C'è qualche altro flusso che posso convogliare in grep per estrarre alcuni dati di cui ho bisogno?
jonderry

Quali informazioni stai effettivamente cercando di estrarre e quali informazioni vuoi buttare via. Ho capito che la tua domanda significa che vuoi che tutto l'output di -v sia diretto a stdout.
SingleNegationElimination

Voglio elaborare alcuni cookie (fondamentalmente prendi alcune informazioni dai cookie e fai altre cose). Sì, voglio che tutto vada a std out, così posso elaborare quello che voglio tramite pipe. Attualmente parte dell'output viene visualizzato solo sulla console e sembra impossibile reindirizzarlo e non sono sicuro del perché.
jonderry

Puoi pubblicare uno screenshot dell'output che appare sullo schermo che desideri catturare? Non so che tipo di output potresti vedere che potrebbe essere perso 2>&1.
SingleNegationElimination

È lo stesso tipo di output di qualsiasi altro sito web. L'unica differenza è che il server è in esecuzione localmente. C'è un modo per qualsiasi programma di stampare sulla console senza che il testo venga catturato da stout / sterr?
jonderry

115

Il tuo URL probabilmente contiene una e commerciale. Ho avuto anche questo problema e mi sono reso conto che il mio URL era pieno di e commerciali (dalle variabili CGI passate) e quindi tutto veniva inviato in background in un modo strano e quindi non reindirizzato correttamente. Se metti delle virgolette attorno all'URL, lo risolverà.


1
Ho avuto lo stesso problema. Non c'è bisogno di 2> & 1 così posso tenere separati l'output e il log delle connessioni. Grazie roadnottaken.
quorniano

3
Adoro Stack-O ... Ho trovato questa q e la menzione di e commerciale nell'URL. Ha messo le virgolette intorno alle mie e il problema è stato risolto.
Paulb

2
Le citazioni hanno fatto il trucco per me. Mi sembrava che curl fosse in esecuzione in altri thread. Molte grazie !
vdolez

1
Ho dovuto cercare sul web per cinque minuti prima che mi
salvassi la

Gesù, che terribile insetto nel ricciolo, almeno dovrebbe fallire o dare un avvertimento. La tua risposta del 2012 mi ha aiutato nel 2018. Mi ci sono voluti 30 minuti per risolvere questo problema finché non ho trovato la tua risposta. Grazie!
Mauvis Ledford

29

La risposta sopra non ha funzionato per me, quello che ha fatto alla fine è stata questa sintassi:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

tee inserisce l'output sullo schermo, ma lo aggiunge anche al mio registro.


1
&> /dev/stdoutera sicuramente la parte mancante, grazie
mattspain


3

Ho trovato la stessa cosa: curl da solo stampa su STDOUT, ma non può essere convogliato in un altro programma.

All'inizio, pensavo di averlo risolto usando xargs per riprodurre prima l'output:

curl -s ... <url> | xargs -0 echo | ...

Ma poi, come sottolineato nei commenti, funziona anche senza la parte xargs, quindi -s(modalità silenziosa) è la chiave per impedire l'output di progressi estranei a STDOUT:

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

L'esempio precedente acquisisce il <sometag>contenuto semplice (non contenente tag incorporati) dall'output XML dell'istruzione curl.


2
nei tuoi esempi "xargs -0 echo |" non è necessario. Finché hai 'curl -s' puoi reindirizzare l'output a un altro programma.
Ryan Horrisberger

1

Solo i miei 2 centesimi. Il comando seguente dovrebbe fare il trucco, come risposto in precedenza

curl -vs google.com 2>&1

Tuttavia, se è necessario ottenere l'output in un file,

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

dovrebbe funzionare.


1
Ciò non aggiunge alcun valore reale alla risposta accettata del 2011. Semmai, questo potrebbe essere un commento a quella risposta.
trincot

0

Quanto segue ha funzionato per me:

Inserisci la tua dichiarazione curl in uno script denominato abc.sh

Adesso corri:

sh abc.sh 1>stdout_output 2>stderr_output

Otterrai i risultati del tuo ricciolo stdout_outpute le informazioni sull'avanzamento stderr_output.


0

Questo semplice esempio mostra come acquisire l'output di curl e utilizzarlo in uno 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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.