¿Cómo canalizo o redirecciono la salida de curl -v?

117

Por alguna razón, la salida siempre se imprime en la terminal, independientemente de si la redirecciono a través de 2> o> o |. ¿Hay alguna forma de evitar esto? ¿Por qué está pasando esto?

Jonderry
fuente
3
Si lo hago curl -v url 2>&1, los errores se redirigen correctamente a la salida estándar para mí.
Josh Lee

Respuestas:

134

agregue la -sopción (silenciosa) para eliminar el medidor de progreso, luego redirija stderr a stdout para obtener una salida detallada en el mismo fd que el cuerpo de respuesta

curl -vs google.com 2>&1 | less
SingleNegationElimination
fuente
3
Esto funciona para la mayoría de los sitios web, pero por alguna razón el servidor local en mi máquina todavía imprime la salida completa, incluso si hago `2> & 1 | grep asdfasdfasdfasdfdfs` o algo así. La salida completa, incluidos los encabezados, todavía se muestra en la consola. ¿Hay alguna otra secuencia que pueda canalizar a grep para extraer algunos datos que necesito?
jonderry
¿Qué información está realmente tratando de extraer y qué información desea desechar? Entendí que su pregunta significaba que desea que toda la salida de -v se dirija a stdout.
SingleNegationElimination
Quiero procesar algunas de las cookies (básicamente, recopilar información de las cookies y hacer otras cosas). Sí, quiero que todo salga a std, para poder procesar lo que quiera a través de tuberías. Actualmente, parte de la salida solo se muestra en la consola y parece imposible de redirigir y no estoy seguro de por qué.
jonderry
¿Puede publicar una captura de pantalla de la salida que aparece en la pantalla que desea capturar? No sé qué tipo de salida podría estar viendo que posiblemente podría pasar por alto 2>&1.
SingleNegationElimination
Es el mismo tipo de salida que con cualquier otro sitio web. La única diferencia es que el servidor se ejecuta localmente. ¿Hay alguna forma de que algún programa imprima en la consola pero no que stout / sterr capture el texto?
Jonderry
115

Su URL probablemente tenga símbolos de unión. También tuve este problema, y ​​me di cuenta de que mi URL estaba llena de símbolos y símbolos (de las variables CGI que se pasaban) y, por lo tanto, todo se enviaba al fondo de una manera extraña y, por lo tanto, no se redirigía correctamente. Si coloca comillas alrededor de la URL, la arreglará.

camino no tomado
fuente
1
Yo tuve el mismo problema. No es necesario el 2> & 1 para poder mantener el registro de salida y de conexión separados. Gracias roadnottaken.
quornian
3
Love Stack-O ... Encontré esta q, y la mención de los símbolos de unión en la URL. Puso comillas alrededor de la mía y problema resuelto.
Paulb
2
Las citas me sirvieron. Sentí que curl se estaba ejecutando en otros hilos. Muchas gracias !
vdolez
1
Tuve que buscar en la web durante cinco minutos antes de que salvaste mi noche :)
Shautieh
Jesús, qué terrible error en el rizo; al menos debería fallar o dar una advertencia. Tu respuesta de 2012 me ayudó en 2018. Me tomó 30 minutos resolver esto hasta que encontré tu respuesta. ¡Gracias!
Mauvis Ledford
29

La respuesta anterior no funcionó para mí, lo que finalmente hizo fue esta sintaxis:

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

tee pone la salida en la pantalla, pero también la agrega a mi registro.

Amir Mehler
fuente
1
&> /dev/stdoutfue definitivamente la parte que faltaba, gracias
mattspain
10

Si necesita la salida en un archivo , puede usar una redirección:

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

Por favor, asegúrese de no voltear >curl-output.txty 2>&1, que no funcionará debido al comportamiento de redirección de bash .

panelista
fuente
3

Encontré lo mismo: curl por sí solo se imprimiría en STDOUT, pero no se podría canalizar a otro programa.

Al principio, pensé que lo había resuelto usando xargs para hacer eco de la salida primero:

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

Pero luego, como se señaló en los comentarios, también funciona sin la parte xargs, por lo que -s(modo silencioso) es la clave para evitar la salida de progreso extraño a STDOUT:

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

El ejemplo anterior toma el <sometag>contenido simple (que no contiene etiquetas incrustadas) de la salida XML de la declaración curl.

Brent Faust
fuente
2
en sus ejemplos el 'xargs -0 echo |' es innecesario. Siempre que tenga 'curl -s', puede canalizar la salida a otro programa.
Ryan Horrisberger
1

Solo mis 2 centavos. El siguiente comando debería hacer el truco, como se respondió anteriormente

curl -vs google.com 2>&1

Sin embargo, si necesita obtener la salida en un archivo,

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

Deberia trabajar.

Thulasiram Gopalakrishna
fuente
1
Esto no agrega ningún valor real a la respuesta aceptada de 2011. En todo caso, esto podría ser un comentario a esa respuesta.
trincot
0

Lo siguiente funcionó para mí:

Pon tu declaración curl en un script llamado abc.sh

Ahora ejecuta:

sh abc.sh 1>stdout_output 2>stderr_output

Obtendrá los resultados de su curl stdout_outputy la información de progreso stderr_output.

amit
fuente
0

Este sencillo ejemplo muestra cómo capturar la salida de curl y usarla en un 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
fuente