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 stdout
así:
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
-s
fue la clave!-s
pero sin-v
usted 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.curl
tojq
. No hay barra de progreso sin canalizarjq
, luego cuando canalizojq
tengo que volver y agregar-s
.STDOUT
no 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.Esto suprimirá el cuadro de diálogo de estado, pero de lo contrario generará errores en STDERR.
Lo anterior genera la tabla de estado al redirigir.
Lo anterior suprime la tabla de estado al redirigir, pero los errores aún irán a STDERR.
Lo anterior es un ejemplo de un error a STDERR.
Simplemente agregue 2> & 1 al final para redirigir STDERR a STDOUT (en este caso, a un archivo).
fuente
De acuerdo a
man curl
:Ejemplo de uso:
o si quieres capturar el HTTP-BODY en una variable en bash
Puedes usar
-s
o--silent
indistintamente.fuente
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
isatty
que informa si un descriptor de archivo se refiere a un terminal.fuente
[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
de la página del manual de curl
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.
de la página del manual de curl
fuente
Para colocar mensajes de error reales en algún lugar, debe escribir strerr en un archivo de registro. Algo como eso:
fuente
Al estar detrás de un proxy, uso un comando como este.
date -s "$ (curl --proxy http: // PROXY: 8080 -s http://google.com --head -s | grep Date | sed 's / Date: // g')"
fuente