有没有办法告诉curl输出错误到stderr,以及stdout的其他所有内容?
原因是我每天晚上都使用命令行中的curl(实际上是一个cronjob)将文件上传到FTP站点。不幸的是因为curl在stderr上输出状态信息,所以当没有任何实际出错时,我收到一封关于错误的电子邮件。 (我正在将stdout重定向到日志文件,但是保持stderr不变,这样如果有任何输出,cron会通过电子邮件发送给我。)
有一些选项可以使curl保持静默,或者将所有内容输出到stdout,但是这两种方法都可以防止错误出现在stderr上 - 这意味着当我想知道实际出现错误时,我不会收到电子邮件。
那么有没有办法让curl只在stderr上输出错误,但是在stdout上保持正常输出不变?
答案 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。