Answers:
这取决于环境,但是我会说它的风格很差。
类似Unix的系统有一个严格的约定,退出状态0表示成功,而任何非零退出状态表示失败。一些(但不是全部)程序可以区分具有不同的非零退出代码的不同类型的故障。例如grep
,如果找到了模式,通常返回0,否则返回1,如果出现错误(例如文件丢失),则返回2(或更多)。
这个约定很难连接到Unix shell中。例如,在sh
,bash
和其他类似Bourne的shell中,该if
语句将0退出状态视为成功/真,将非零退出状态视为失败/假:
if your-command
then
echo ok
else
echo FAILURE
fi
我相信MS Windows下的约定是相似的。
现在肯定没有什么可以阻止您编写使用非常规退出代码的程序,尤其是如果没有其他东西要与之交互的话,但是请注意您违反了一个已建立好的约定,以后它可能会回来咬住您。
程序返回此类信息的通常方法是将其打印到stdout
:
status = $(your-command)
echo Result is $status
grep
,diff
找到差异时返回1;否则返回1。如果发生错误,则> 1。
我认为,如果退出代码向调用者返回有意义的相关信息,并且成功的定义不是真正的二进制,则有先例。我想到的先例是robocopy,它根据发生的事情返回许多不同的东西。
我要补充一点,由于这个原因,我们总是总是要进行调试-大多数实用程序都假定退出代码0 ==成功,所以当robocopy返回1时会感到惊讶,因为它复制的内容不是零,因为它没有复制内容,但是没有也不会出现错误。
我知道我认为可以接受的情况。我知道一个测试框架会随着测试失败的总数而退出。因此,例如,如果测试运行器完成但没有失败的测试,则退出时为零。如果一项测试失败,即使测试运行器本身正确运行,它也将以1退出。如果两项失败,则返回2,依此类推。直到250,这表示“ 250或更多测试失败”。
它使用退出代码> 250表示异常退出。
虽然这违反约定,但在实践中效果很好。
set -e
放在某个地方,这种方法会破坏我的大多数shell脚本。