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

9
当我实现自己的脚本时,为不同的失败场景使用不同的退出代码是最佳实践吗?还是只需返回退出代码1表示失败,0表示成功,并在stderr中提供原因即可?
2个回答

5

在交互用户方面,向stderr提供描述性错误消息是可以的,但如果您希望您的脚本被其他脚本/程序使用,您应该为不同的故障设置独特的错误代码,以便调用脚本可以根据情况做出明智的决策。

如果调用程序不想对不同的失败进行不同的处理,它始终可以检查返回代码是否为> 0 ,但不要假设这就是情况。


1
我同意。0始终表示OK,正数用作错误,负数用作警告。这样,调用者可以决定是否检查非零(出现了错误或警告)或大于零(出现了错误)。对于退出代码的值,在Windows批处理编程中有一个(对我而言相当奇怪的)“IF ERRORLEVEL n”的行为需要考虑,如果n等于或小于应用程序返回的错误代码,则返回true。提示:“IF %ERRORLEVEL%==n”仅在存在完全匹配时返回true。 - Christoph
我刚意识到它必须相反:警告必须大于零,而错误值为负数 - 然后“IF ERRORLEVEL n”才有意义:如果退出代码是10,则0也为真,但如果是-10则不是。 - Christoph

2

有一些建议,可以参考维基百科,但不是规范,除了0表示成功之外:

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

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

兼容POSIX的系统通常使用零表示成功,非零表示错误。[8]已经发展出一些关于各种错误代码相对含义的约定;例如GNU推荐使用高位设置的代码保留给严重错误,[3]而FreeBSD已经记录了一套广泛接受的解释。[9]15个状态代码64到78的含义在sysexits.h中定义。这些历史上源自sendmail和其他消息传输代理,但现在在许多其他程序中也得到了应用。[10]*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接