cURL: ¿cómo suprimir resultados extraños al redirigir?

67

Estoy tratando de imprimir solo las secciones detalladas de una solicitud cURL (que se envían a stderr) desde el shell bash.

Pero cuando redirecciono stdoutasí:

curl -v http://somehost/somepage > /dev/null

Aparece algún tipo de tabla de resultados en el medio de la salida para stderr:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

Seguido por esto cerca del final:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

Lo que hace que los encabezados de respuesta sean menos legibles.

No veo este texto cuando no estoy redirigiendo.


Otra forma de ver los efectos:

La tabla no aparece:

curl -v http://somehost/somepage 2>&1

Aparece la tabla:

curl -v http://somehost/somepage 2>&1 | cat

1) ¿Cómo es que esto aparece solo con ciertos tipos de redireccionamientos?

2) ¿Cuál es la mejor manera de suprimirlo?

Gracias

Ian Mackinnon
fuente

Respuestas:

60

Prueba esto:

curl -vs -o /dev/null http://somehost/somepage 2>&1

Que suprimirá la barra de progreso, enviar stdouta /dev/nully redirección stderr(la -vsalida) a stdout.

Dennis Williamson
fuente
32
Gracias, -sfue la clave!
Ian Mackinnon el
66
@IanMackinnon Tenga en cuenta que con -spero sin -vusted no verá errores como la falta de conexión. Para eso también debe agregar -S(o --show-error) como en la respuesta de mhoydis.
Artyom
pero ¿por qué la barra de progreso solo aparece en primer lugar al redirigir? Me encontré con este mismo problema al canalizar la salida de curlto jq. No hay barra de progreso sin canalizar jq, luego cuando canalizo jqtengo que volver y agregar -s.
sixty4bit
@ sixty4bit: Esa es una elección de diseño que hicieron los desarrolladores. El programa puede detectar cuando STDOUTno es un tty. Cuando la salida no se está canalizando, no desea que la información de progreso se entremezcle con la salida normal, que puede ver y tener una idea del progreso. Cuando la salida se redirige o canaliza, no puede verla, por lo que no tiene un indicador de progreso, a menos que la barra de progreso esté activada.
Dennis Williamson
23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

Esto suprimirá el cuadro de diálogo de estado, pero de lo contrario generará errores en STDERR.

user@host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

Lo anterior genera la tabla de estado al redirigir.

user@host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

Lo anterior suprime la tabla de estado al redirigir, pero los errores aún irán a STDERR.

user@host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve host 'www.errorexample.com'

Lo anterior es un ejemplo de un error a STDERR.

user@host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'www.errorexample.com'

Simplemente agregue 2> & 1 al final para redirigir STDERR a STDOUT (en este caso, a un archivo).

mhoydis
fuente
5

De acuerdo a man curl:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

Ejemplo de uso:

curl -s 'http://www.google.com'

o si quieres capturar el HTTP-BODY en una variable en bash

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

Puedes usar -so --silentindistintamente.

Venkatt Guhesan
fuente
4

Con referencia a la pregunta 1 ( cómo cURL sabe mostrar solo la tabla cuando se redirige la salida), no me di cuenta de que un programa podría decir que sus salidas se dirigían, pero parece que en los sistemas POSIX hay una función isattyque informa si un descriptor de archivo se refiere a un terminal.

Ian Mackinnon
fuente
2
Aquí hay un fragmento de Bash:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
Dennis Williamson
2

1) ¿Cómo es que esto aparece solo con ciertos tipos de redireccionamientos?

de la página del manual de curl

Si desea un medidor de progreso para las solicitudes HTTP POST o PUT, debe redirigir la salida de respuesta a un archivo, utilizando la redirección de shell (>), -o [archivo] o similar.

curl debe usar isatty para determinar la redirección e imprime el medidor de progreso cuando se redirige a un archivo o tubería de shell.

2) ¿Cuál es la mejor manera de suprimirlo?

de la página del manual de curl

-s, - silencioso

Modo silencioso o silencioso. No muestre el medidor de progreso ni los mensajes de error. Hace que Curl quede mudo. Todavía emitirá los datos que solicite, potencialmente incluso al terminal / stdout a menos que lo redirija.

Wyrmwood
fuente
1

Para colocar mensajes de error reales en algún lugar, debe escribir strerr en un archivo de registro. Algo como eso:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
usuario1065951
fuente