使curl向stderr发送错误,并将其他所有内容发送到stdout

时间:2011-08-04 00:49:35

标签: curl stdout stderr

有没有办法告诉curl输出错误到stderr,以及stdout的其他所有内容?

原因是我每天晚上都使用命令行中的curl(实际上是一个cronjob)将文件上传到FTP站点。不幸的是因为curl在stderr上输出状态信息,所以当没有任何实际出错时,我收到一封关于错误的电子邮件。 (我正在将stdout重定向到日志文件,但是保持stderr不变,这样如果有任何输出,cron会通过电子邮件发送给我。)

有一些选项可以使curl保持静默,或者将所有内容输出到stdout,但是这两种方法都可以防止错误出现在stderr上 - 这意味着当我想知道实际出现错误时,我不会收到电子邮件。

那么有没有办法让curl只在stderr上输出错误,但是在stdout上保持正常输出不变?

4 个答案:

答案 0 :(得分:27)

试试这个:

# 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

感谢Russell Davis在此页面上的回答man curl,以及反复试验。 对于好奇,这是问题的wget版本:https://superuser.com/questions/420120/wget-is-silent-but-it-displays-error-messages

答案 1 :(得分:5)

curl -s -S

从手册页:

  

-s静音或安静模式。不显示进度表或错误消息。使卷曲静音。

     

-S与-s一起使用时,如果curl失败,则会使curl显示错误消息。

答案 2 :(得分:3)

经过一些实验后,我提出了以下解决方法,但我仍然愿意接受更好的替代方案。

它的工作原理是将所有输出(stdout和stderr)临时存储在临时文件中,然后根据curl的退出代码将该文件的内容发送到stderr或stdout。如果curl失败,整个输出将转到stderr(并通过cron通过电子邮件发送给我),但如果curl成功,输出将转到stdout(它被重定向到cron命令中的日志文件,导致no电子邮件。)

# 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 :(得分:1)

curl -f。文档说“在服务器错误上无声地失败(根本没有输出)”但它实际上意味着“没有输出到stdout” - 错误仍将输出到stderr。