我正在重构一些旨在从命令行运行的 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
触发的消息,因为已经被用于获取实际结果。所以你将有一个零退出代码并输出到:--verbose
stderr
stdout
stderr
$ curl ifconfig.me
$ curl --verbose ifconfig.me 2>messages.txt
另一方面,退出代码是sys.exit()
(参见_退出(2)和退出(3))。没有任何规则将两者联系起来。拿grep
, 例如;如果出现错误,将输出到stderr
,但可能会根据标志调整退出代码。
通常,如果选择了一行,则退出状态为 0;如果没有选择行,则退出状态为 1;如果发生错误,则退出状态为 2。然而,如果
-q
或者--quiet
或者--silent
使用并选择了一行,即使发生错误,退出状态也为 0。
答案3
嗯,我还是不太清楚这个问题想问什么。但是,既然它已经重新开放,我将发布我之前所说的内容。冒着重复其他人(和我)说过的话的风险:
- 程序当然有可能写入 stderr,但仍然以状态 0 退出。虽然这种情况不常见,但并不被认为是不好的做法。
- 如果您主要关心的是运行程序是否合适/安全 N+1节目结束后 氮(以及可能的其他前置任务)已经退出,您可能应该仅根据退出状态做出该决定。
- 如果您想将异常情况升级为引起人们的注意,并且这些异常情况尚未被充分记录, 然后你应该看看stderr。