Faire curl envoyer des erreurs à stderr et tout le reste à stdout

y a-t-il un moyen de dire à curl les erreurs de sortie à stderr, et tout le reste à stdout?

la raison est que j'utilise curl à partir de la ligne de commande (en fait un cronjob) pour télécharger un fichier sur un site FTP tous les soirs. Malheureusement parce que curl affiche des informations de statut sur stderr, je reçois un e-mail à propos d'une erreur quand rien ne s'est réellement passé. (Je redirige stdout vers un fichier journal, mais en laissant stderr inchangé pour que cron me l'envoie par e-mail si il n'y a aucune sortie.)

il y a des options pour rendre curl silent, ou tout sortir pour stdout, cependant ces deux alternatives empêchent les erreurs d'apparaître sur stderr - ce qui signifie que je ne recevrai pas un e-mail quand il ya effectivement une erreur que je veux savoir.

alors y a-t-il un moyen de ne faire que des erreurs de sortie curl sur stderr, mais de laisser la sortie normale intacte sur stdout?

22
demandé sur Malvineous 2011-08-04 04:49:35

4 réponses

essayez ceci:

# 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

merci à la réponse de Russell Davis sur cette page, man curl , et d'essai et d'erreur. Pour les curieux, voici la version wget de la question: https://superuser.com/questions/420120/wget-is-silent-but-it-displays-error-messages

24
répondu dgo.a 2017-03-20 10:18:14

après quelques expérimentations supplémentaires, j'ai trouvé la solution suivante, mais je suis toujours ouvert à de meilleures alternatives.

il fonctionne en stockant temporairement toutes les sorties (stdout et stderr) dans un fichier temporaire, puis en envoyant le contenu de ce fichier à stderr ou stdout en fonction du code de sortie de curl. Si curl échoue, toute la sortie ira à stderr( et me sera envoyée par e-mail grâce à cron), mais si curl réussit, la sortie ira plutôt à stdout (qui est redirigé vers un fichier journal dans la commande cron, ce qui n'entraîne pas d'e-mail.)

# 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"
3
répondu Malvineous 2011-08-04 01:59:23

curl -f . La documentation dit "silencieuse (pas de sortie) sur les erreurs de serveur", mais il signifie vraiment "pas de sortie sur stdout" -- erreurs seront toujours de sortie vers stderr.

1
répondu Russell Davis 2013-01-16 22:34:39

curl -s -S

de la page de manuel:

- s mode silencieux ou silencieux. Ne pas afficher le compteur de progression ou les messages d'erreur. Rend Curl muet.

- s quand il est utilisé avec-s il fait curl afficher un message d'erreur si elle échoue.

1
répondu Timmah 2016-12-21 14:04:03