程序可以输出到 STDERR 并且仍然返回零退出状态吗?

程序可以输出到 STDERR 并且仍然返回零退出状态吗?

我正在重构一些旨在从命令行运行的 Python 脚本。这些脚本使用日志记录,这使得一些消息被写入 STDERR(除其他外)。我想知道 Linux 中的程序输出到 STDERR 是否合适,但仍然返回零(成功)退出状态。我认为只有退出状态非零时才应该咨询 STDERR。

PS 基本上我需要捕获脚本的输出,并将其发送到另一个服务进行处理,以及退出状态。我希望数据保持一致。

答案1

是的,程序可以输出到标准错误,并且仍然返回零退出状态。您会发现许多 POSIX 实用程序规范都规定“标准错误仅适用于诊断消息。”

输出到 STDERR 并返回 0 的程序的一个清晰示例是crontab。尝试

EDITOR=nano crontab -e 2> stderr.out; echo $?

不要修改 cron 文件并退出编辑器。0将被回显,但会出现一些消息stderr.out,例如(在我的情况下)

no crontab for user - using an empty one
No modification made

答案2

stderr只是一个带有文件号的预定义流2。约定是打印重要或替代信息(不一定是错误)。

例如,默认情况下将输出由tocurl触发的消息,因为已经被用于获取实际结果。所以你将有一个零退出代码并输出到:--verbosestderrstdoutstderr

$ curl ifconfig.me

$ curl --verbose ifconfig.me 2>messages.txt

另一方面,退出代码是sys.exit() (参见_退出(2)退出(3))。没有任何规则将两者联系起来。拿grep, 例如;如果出现错误,将输出到stderr,但可能会根据标志调整退出代码。

通常,如果选择了一行,则退出状态为 0;如果没有选择行,则退出状态为 1;如果发生错误,则退出状态为 2。然而,如果-q或者--quiet或者 --silent使用并选择了一行,即使发生错误,退出状态也为 0。

答案3

嗯,我还是不太清楚这个问题想问什么。但是,既然它已经重新开放,我将发布我之前所说的内容。冒着重复其他人(和我)说过的话的风险:

  1. 程序当然有可能写入 stderr,但仍然以状态 0 退出。虽然这种情况不常见,但并不被认为是不好的做法。
  2. 如果您主要关心的是运行程序是否合适/安全 N+1节目结束后 (以及可能的其他前置任务)已经退出,您可能应该仅根据退出状态做出该决定。
  3. 如果您想将异常情况升级为引起人们的注意,并且这些异常情况尚未被充分记录, 然后你应该看看stderr。

相关内容