¿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?
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
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á.
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.
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:
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
curl -v url 2>&1
, los errores se redirigen correctamente a la salida estándar para mí.Respuestas:
agregue la
-s
opció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 respuestafuente
2>&1
.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á.
fuente
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.
fuente
&> /dev/stdout
fue definitivamente la parte que faltaba, graciasSi necesita la salida en un archivo , puede usar una redirección:
Por favor, asegúrese de no voltear
>curl-output.txt
y2>&1
, que no funcionará debido al comportamiento de redirección de bash .fuente
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:
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:El ejemplo anterior toma el
<sometag>
contenido simple (que no contiene etiquetas incrustadas) de la salida XML de la declaración curl.fuente
Solo mis 2 centavos. El siguiente comando debería hacer el truco, como se respondió anteriormente
Sin embargo, si necesita obtener la salida en un archivo,
Deberia trabajar.
fuente
Lo siguiente funcionó para mí:
Pon tu declaración curl en un script llamado
abc.sh
Ahora ejecuta:
Obtendrá los resultados de su curl
stdout_output
y la información de progresostderr_output
.fuente
Este sencillo ejemplo muestra cómo capturar la salida de curl y usarla en un script bash
test.sh
fuente