在Linux中,如果进程的退出状态为0,则认为该进程已正确完成。

我看到分割错误经常导致退出状态为11,尽管我不知道这只是我工作的地方的惯例(像这样失败的应用程序都是内部的)还是一种标准。

Linux中进程有标准的退出码吗?


当前回答

粗略地说,0代表成功,非0代表失败,1代表一般失败,大于1代表特定失败。除了false和test这两个简单的例外,我还发现了其他一些例外。

更现实地说,0意味着成功或可能失败,1意味着一般的失败或可能成功,2意味着一般的失败,如果1和0都用来表示成功,但也可能是成功。

如果比较的文件相同,diff命令给出0,如果不同,则给出1,如果二进制文件不同,则给出2。2也意味着失败。less命令为失败提供1,除非您未能提供参数,在这种情况下,尽管失败,它仍退出0。

more命令和spell命令给出1表示失败,除非失败是由于权限被拒绝、文件不存在或试图读取目录造成的。在任何这些情况下,尽管失败,它们仍然退出0。

然后expr命令给出1表示成功,除非输出是空字符串或零,在这种情况下,0表示成功。2和3是失败。

还有一些情况下,成功或失败是模棱两可的。当grep无法找到一个模式时,它退出1,但它退出2是真正的失败(比如拒绝许可)。Klist在找不到票时也会退出1,尽管这并不比grep找不到模式或ls一个空目录更失败。

因此,不幸的是,Unix的强大功能似乎并没有强制执行任何逻辑规则集,即使是在非常常用的可执行文件上。

其他回答

头文件sysexits.h有一个标准退出码列表。它似乎至少可以追溯到1993年,一些大型项目,如Postfix使用它,所以我认为这是一种方式。

从OpenBSD手册页:

根据style(9),在结束程序时,用任意值调用exit(3)来指示失败条件并不是一个好的实践。相反,应该使用来自sysexits的预定义退出码,以便进程的调用者可以获得关于故障类的粗略估计,而无需查找源代码。

正如David提到的,标准的Unix退出码是由sysexits.h定义的。 类似Poco这样的可移植库也使用相同的退出码——下面是它们的列表:

类Poco::Util::Application, ExitCode

信号11是SIGSEGV(分段违例)信号,它不同于返回码。这个信号是由内核在响应错误的页面访问时生成的,这会导致程序终止。信号列表可以在信号手册页中找到(运行"man signal")。

粗略地说,0代表成功,非0代表失败,1代表一般失败,大于1代表特定失败。除了false和test这两个简单的例外,我还发现了其他一些例外。

更现实地说,0意味着成功或可能失败,1意味着一般的失败或可能成功,2意味着一般的失败,如果1和0都用来表示成功,但也可能是成功。

如果比较的文件相同,diff命令给出0,如果不同,则给出1,如果二进制文件不同,则给出2。2也意味着失败。less命令为失败提供1,除非您未能提供参数,在这种情况下,尽管失败,它仍退出0。

more命令和spell命令给出1表示失败,除非失败是由于权限被拒绝、文件不存在或试图读取目录造成的。在任何这些情况下,尽管失败,它们仍然退出0。

然后expr命令给出1表示成功,除非输出是空字符串或零,在这种情况下,0表示成功。2和3是失败。

还有一些情况下,成功或失败是模棱两可的。当grep无法找到一个模式时,它退出1,但它退出2是真正的失败(比如拒绝许可)。Klist在找不到票时也会退出1,尽管这并不比grep找不到模式或ls一个空目录更失败。

因此,不幸的是,Unix的强大功能似乎并没有强制执行任何逻辑规则集,即使是在非常常用的可执行文件上。

当Linux返回0时,意味着成功。其他都意味着失败。每个程序都有自己的退出码,所以要把它们都列出来实在是太长了……!

关于11错误代码,它确实是分段错误编号,主要意味着程序访问了一个没有分配的内存位置。

以前的答案都没有正确描述退出状态2。与他们声称的相反,状态2是您的命令行实用程序在不正确调用时实际返回的结果。(是的,一个答案可能是九年前的事了,得到了数百个赞,但仍然是错误的。)

下面是真正的,长期存在的正常终止的退出状态约定,即不是通过信号:

退出状态0:success 退出状态1:“失败”,由程序定义 退出状态2:命令行使用错误

例如,如果比较的文件相同,diff返回0,如果不同则返回1。根据长期以来的惯例,unix程序在被错误调用(未知选项,错误的参数数量等)时返回退出状态2。例如,diff -N, grep -Y或diff a b c都将导致$?被设置为2。这是自20世纪70年代Unix早期以来的实践。

接受的答案解释了当一个命令被一个信号终止时会发生什么。简而言之,由于未捕获信号而终止的结果是退出状态128+[<信号号>。例如,由SIGINT终止(信号2)导致退出状态130。

笔记

Several answers define exit status 2 as "Misuse of bash builtins". This applies only when bash (or a bash script) exits with status 2. Consider it a special case of incorrect usage error. In sysexits.h, mentioned in the most popular answer, exit status EX_USAGE ("command line usage error") is defined to be 64. But this does not reflect reality: I am not aware of any common Unix utility that returns 64 on incorrect invocation (examples welcome). Careful reading of the source code reveals that sysexits.h is aspirational, rather than a reflection of true usage: * This include file attempts to categorize possible error * exit statuses for system programs, notably delivermail * and the Berkeley network. * Error numbers begin at EX__BASE [64] to reduce the possibility of * clashing with oth­er exit statuses that random programs may * already return. In other words, these definitions do not reflect the common practice at the time (1993) but were intentionally incompatible with it. More's the pity.