【问题标题】:Making curl send errors to stderr and everything else to stdout使 curl 将错误发送到 stderr 并将其他所有内容发送到 stdout
【发布时间】:2011-10-19 14:02:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: curl stdout stderr


    【解决方案1】:

    curl -s -S

    来自手册页:

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

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

    【讨论】:

    • 查看@dgo.a 答案下的 cmets - 这也删除了告诉您事情是否按预期工作的正常进度消息,我想保留在标准输出上。
    【解决方案2】:

    试试这个:

    # 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

    【讨论】:

    • --silent 不会阻止将正常进度消息发送到标准输出吗?我仍然希望看到这些,以便我知道 curl 实际上正在做某事!
    • 我的回答还有一个问题:我从来没有使用 curl 进行 FTP 上传。这是在浪费你的时间。我很抱歉忽略了你问题的重要方面。我将删除此答案以避免进一步混淆。
    • 别担心 - 它可能会帮助其他人,就像 Russell Davis 的回答给了你一些想法一样 :-)
    【解决方案3】:

    curl -f。文档说“服务器错误时静默失败(根本没有输出)”,但它实际上意味着“没有输出到标准输出”——错误仍然会输出到标准错误。

    【讨论】:

      【解决方案4】:

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

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

      # 获取临时文件名 CURL_LOG=`临时文件` ( # 运行 curl,并将所有输出粘贴到临时文件中 /usr/bin/curl --verbose ...> "$CURL_LOG" 2>&1 ) || ( # 如果 curl 以非零错误代码退出,则将其输出发送到 stderr 以便 # cron 将通过电子邮件发送它。 猫 "$CURL_LOG" > /dev/stderr rm "$CURL_LOG" 1号出口 ) # 否则 curl 成功完成,所以将输出发送到标准输出( # 被重定向到 crontab 中的日志文件) 猫“$CURL_LOG” rm "$CURL_LOG"

      【讨论】:

      • 它不像其他答案那样简短而甜蜜,但它是唯一真正完成工作的答案。感谢分享。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2019-03-29
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多