设置退出状态代码的最佳实践

Posted

技术标签:

【中文标题】设置退出状态代码的最佳实践【英文标题】:Best practices on setting exit status codes 【发布时间】:2015-06-01 08:57:20 【问题描述】:

在实现我自己的脚本时,最好的做法是针对不同的失败场景使用不同的退出代码退出吗?或者我应该只返回退出代码 1 表示失败,返回 0 表示成功,并在 stderr 上提供原因?

【问题讨论】:

【参考方案1】:

向 stderr 提供描述性错误消息对于交互式用户来说很好,但如果您希望您的脚本被其他脚本/程序使用,您应该为不同的故障提供不同的错误代码,因此调用脚本可以生成就如何处理故障做出明智的决定。

如果调用程序不希望以不同的方式处理不同的故障,它总是可以根据> 0 检查返回码 - 但不要假设是这种情况。

【讨论】:

我同意。 0 总是可以的,正数用作错误,负数用作警告。像这样,调用者可以决定是检查非零(有错误或警告)还是大于零(有错误)。对于退出代码的值,Windows 批处理编程中存在“IF ERRORLEVEL n”的这种(对我来说相当奇怪)行为,以考虑如果 n 等于或小于(!)应用程序返回的错误代码,则返回 true .提示:“IF %ERRORLEVEL%==n”只有在完全匹配时才返回 true。 我只是意识到它必须相反:警告必须大于零并且错误为负值 - 然后“IF ERRORLEVEL n”才有意义:如果退出代码为 10 但不是,则 0 也为真如果是 -10。【参考方案2】:

有一些建议,见***,但不是规范的,除了成功的 0 之一:

http://en.wikipedia.org/wiki/Exit_status#POSIX

*在 Unix 和其他与 POSIX 兼容的系统中,wait 系统调用将 int 类型的状态值设置为包含各种类型的子终止信息的位域。如果孩子因退出而终止(由 WIFEXITED 宏确定;通常的替代方法是它死于未捕获的信号),SUS 指定可以使用 WEXITSTATUS 从状态值中检索退出状态的低 8 位wait.h中的宏;[6][7]在使用POSIX waitid系统调用(随POSIX-2001添加)时,状态的范围不再受限,可以在全整数范围内。

POSIX 兼容系统通常使用约定为零表示成功,非零表示错误。[8]关于各种错误代码的相对含义已经形成了一些约定;例如 GNU 建议为严重错误保留设置高位的代码,[3] 并且 FreeBSD 已经记录了一组广泛的首选解释。 [9] 15 个状态码 64 到 78 的含义在 sysexits.h 中定义。它们在历史上源自 sendmail 和其他消息传输代理,但后来在许多其他程序中得到使用。[10]*

【讨论】:

以上是关于设置退出状态代码的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

临时维护页面的最佳实践方法和状态代码是啥?

最佳实践-设计-状态设计

有状态集最佳实践的动态扩展

使用 WantsFullScreenLayout 应用程序处理扩展高度状态栏的最佳实践?

任务终止的最佳实践

循环最佳实践