如何查找Linux命令行工具的退出代码含义?

15

我已经配置了我的提示符(bash)以在上一个命令未成功(即非零)时打印出其退出代码。因此,即使程序似乎没有遇到任何问题,我也会看到很多退出代码。有没有一种方法可以查找这些退出代码的含义?

我总是尝试man页面、info页面或"--help"选项,但都没有结果。

为了澄清,我问的是关于Linux自带的实用工具,比如cdlsdu等的问题。


阅读此内容:https://dev59.com/o3NA5IYBdhLWcg3wEpgU或浏览 /usr/include/sysexits.h。 - Icarus
在 man 手册中,它们被称为“退出状态”。您提到了 ls 命令:如果我输入 man ls 并且搜索 /exit status,将会跳转到相关段落。 - etuardu
4
对于那些将此标记为“不相关”的人,这是关于shell编程以及退出状态的含义,从而如何在编程时处理它们。因此,这完全符合SO的主题。如果你将其关闭为1101957的重复,我会有些同情你;这些问题涉及到了很多相同的内容(但是当我查看时,这3个关闭都是不相关的 - 在我看来是错误的)。 - Jonathan Leffler
3个回答

16
程序退出代码的标准化含义仅限于“0表示正常,其他任何值表示出现问题”。严格来说,这只适用于C和C++ - 在那里,exit(0);exit(EXIT_SUCCESS);都表示成功退出,但返回给操作系统的值可能不同。
即使是零表示成功的规则也有例外。显然,有些粗心的程序没有返回定义的退出状态;最好避免使用此类程序。还有其他一些不那么粗心的程序,即使发生了错误,它们始终返回0;这些程序也经常应该避免使用。
然而,还有一些程序会仔细地将相当多的信息编码到退出状态中,而且仅仅获得非零退出状态并不意味着这些程序失败了。当然,这些程序记录了退出状态的含义。
POSIX非常注意为程序记录退出状态。
程序的手册页应记录退出状态。在Unix上,如果没有这样的文档,则假定零表示成功,其他任何情况均表示失败。
请注意,如果bash无法执行命令,则会返回格式化的状态:
  • 如果文件不存在或无法找到,则为127
  • 如果您没有对该文件执行权限,则为126
此外,如果程序因信号而死亡,bash会将退出状态编码为:
  • 128 + 信号编号
因此,SIGHUP产生129,SIGILL产生132,SIGTERM产生143等。但是,程序可能以任何这些状态之一退出,并且意味着与bash的含义不同。尽管如此,通常很少有程序以这些退出状态之一退出,因此您通常是安全的。

请注意不同操作系统的惯例:Unix提供了一个8位状态,其中0表示成功;Windows提供了更大范围的退出状态值(16位或32位);我认为VMS使用0表示失败。


你能说出一个没有退出状态的程序吗?那么 echo $? 会报告什么呢?据我所知,每个程序都有一个隐含的返回值。我同意“没有标准化”的部分。 - user unknown
我知道有一些程序不提供可靠的退出状态 - 更多的是“即使出现问题也始终为0”的类型,而不是与成功或失败无关的“某些随机(通常是非零)值”。这些程序往往是本地的、定制的程序,而不是众所周知的公开程序;当程序变得众所周知时,像退出状态这样的东西就会被清理干净。 - Jonathan Leffler

1

人页是这份文档的传统位置。如果你在 Debian 等系统上,甚至会期望你对未记录退出代码的实用程序提交错误报告。


1

它确实有作用,但ABS(注:可能指绝对值函数)并不十分权威。 - tripleee

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