如何查找应用程序的退出代码?

Dav*_*ove 9 documentation exit exit-status

我很难从 Bash 中找到完整的最新错误代码列表。例如:

$ udevadm info /dev/sdx; echo Exit code $?
Unknown device, --name=, --path=, or absolute path in /dev/ or /sys expected.
Exit code 4
Run Code Online (Sandbox Code Playgroud)

应该如何查找这样的退出代码?

jas*_*yan 12

有一些退出代码具有保留的特殊含义

退出代码编号含义
1 Catchall 一般错误
2 滥用 shell 内置函数(根据 Bash 文档)
126 调用的命令无法执行
127“未找到命令”
128+n 致命错误信号“n”
130 脚本被 Ctrl-C 终止
255* 退出状态超出范围

低于 125 的所有内容对开发人员来说都是公平的游戏,并且实际上只能通过阅读应用程序页面或源代码来确定代码的含义(如果确实记录在案),正如l0b0 在他的回答中指出的那样man一点)。

  • 还应该注意的是,这些仅由*约定*“保留” - 没有强制措施(除了良好的感觉)实际上阻止例如使用“1”或“2”来表示“成功”的应用程序。对于开发人员来说,一切实际上都是公平的游戏。 (2认同)

l0b*_*0b0 11

tl;dr退出代码是特定于应用程序的。

有一些松散的约定。false并且在 POSIX shell 中任何以!(如! true)为前缀的成功都返回退出代码 1,但开发人员可以根据需要使用 0 到 255 之间的任何退出代码。最终,您必须查看其文档(在最好的情况下)或代码(在最坏的情况下)才能知道它的含义。对于带有man页面的程序,退出代码通常会列在名为EXIT STATUS(GNU 工具,如find)的部分中。

一些流行的含义列在/usr/include/sysexits.h- 我尽量使用它们。正如@AnsgarEsztermann 指出的那样,除了那些选择使用它的人(主要根据 ABS 的C/C++ 开发人员)之外,这些都不是 Bash 参考,甚至不是应用程序参考。

  • 如果从 l0b0 的回答中还不清楚这一点:这些退出代码不是“bash 退出代码”。它们完全属于现有命令,如果以不涉及 bash 的不同方式调用这些命令,它们将不会改变。 (2认同)