curl stdout stderr

Hacer que curl envíe errores a stderr y todo lo demás a stdout



(4)

¿Hay alguna manera de decirle a curl sobre los errores de salida a stderr y todo lo demás a stdout?

La razón es que estoy usando curl desde la línea de comandos (en realidad, un cronjob) para subir un archivo a un sitio FTP todas las noches. Desafortunadamente, debido a que curl muestra información de estado en stderr, recibo un correo electrónico sobre un error cuando en realidad no salió mal. (Estoy redireccionando stdout a un archivo de registro, pero sin modificar stderr para que cron me lo envíe por correo electrónico si hay algún resultado).

Hay opciones para hacer que curl permanezca en silencio, o dar salida a todo en stdout, sin embargo, ambas alternativas evitan que aparezcan errores en stderr, lo que significa que no recibiré un correo electrónico cuando en realidad haya un error que desee conocer.

Entonces, ¿hay alguna manera de hacer que los errores de salida solo se curven en stderr, pero dejar la salida normal intacta en stdout?


Después de un poco más de experimentación, he encontrado la siguiente solución alternativa, pero todavía estoy abierto a mejores alternativas.

Funciona almacenando temporalmente todos los resultados (stdout y stderr) en un archivo temporal, y luego enviando los contenidos de ese archivo a stderr o stdout dependiendo del código de salida de curl. Si Curl falló, toda la salida se transferirá a stderr (y se me enviará por correo electrónico gracias a cron), pero si curl tuvo éxito, la salida irá a stdout (que se redirige a un archivo de registro en el comando cron, lo que da como resultado correo electrónico.)

# Get a temporary filename CURL_LOG=`tempfile` ( # Run curl, and stick all output in the temp file /usr/bin/curl --verbose ... > "$CURL_LOG" 2>&1 ) || ( # If curl exited with a non-zero error code, send its output to stderr so that # cron will e-mail it. cat "$CURL_LOG" > /dev/stderr rm "$CURL_LOG" exit 1 ) # Otherwise curl completed successfully, so send the output to stdout (which # is redirected to a log file in crontab) cat "$CURL_LOG" rm "$CURL_LOG"


Prueba esto:

# No error messages because it succeeds. curl http://www.shikadi.net/ --fail --silent --show-error # This prints an error message to stderr curl http://i.like.you.def.maybe/ --fail --silent --show-error

Gracias a la respuesta de Russell Davis en esta página, man curl , y prueba y error. Para los curiosos, aquí está la versión de la pregunta de wget : https://superuser.com/questions/420120/wget-is-silent-but-it-displays-error-messages


curl -f . La documentación dice "Fallar silenciosamente (sin salida) en los errores del servidor", pero realmente significa "sin salida a la salida estándar": los errores seguirán generados en stderr.


curl -s -S

Desde la página man:

-s Modo silencioso o silencioso. No muestre el medidor de progreso o mensajes de error. Hace que Curl se quede mudo.

-S Cuando se usa con -s, hace que Curl muestre un mensaje de error si falla.