我知道 shell 的$?
保存最后执行的程序exit status
。
例如,当我运行以下命令时,我看到不同情况下的不同状态。
test$ hello
-bash: hello: command not found
test$ echo $?
127
test$ expr 1 / 0
expr: division by zero
test$ echo $?
2
我想知道系统或互联网中是否有任何常见的退出状态列表,我可以在其中获取所有退出状态及其描述。我在这里找到了一个列表,但缺少一些代码,例如status code 127
.
不可能有完整的列表,因为命令退出状态的含义本质上是特定于命令的。对于给定的命令,您通常可以在相应命令的手册页和信息文档中获取有关此命令的信息。
在以下情况下:
test$ hello
-bash: hello: command not found
test$ echo $?
127
退出代码127
来自bash
,因为找不到请求的命令本身。
在以下情况下:
test$ expr 1 / 0
expr: division by zero
test$ echo $?
2
退出代码2
来自expr
。
其中一些命令可能是标准化的,或者至少针对多个命令或一组命令进行了协调(例如"sh
兼容的shell",我可以想象),但除非命令想要符合这些约定之一(并且可能有多个冲突的约定),命令的作者可以完全自由地决定他们希望退出状态代码的含义。
有一个重要的例外:所有 UNIX 命令都应遵守此松散规则,以成为好公民,并在命令行上提供有意义的可组合性(例如使用管道):
0
的意思是"成功"或"真实"/"真实">- 非
0
意味着(在非常广泛的意义上)"失败"或"不成功"或"虚假"/"虚假">
如您所见,这仍然留下了很大的解释空间,这是完全有意的,因为这些含义必须特定于各个命令的上下文。(例如,考虑false
命令,它的目的是"失败",因此总是返回非0
退出代码。
找到的列表描述了系统调用的返回代码。系统调用是当程序向内核发出请求时,与命令调用不同,因此这些返回代码(不一定)与命令退出代码不同。
退出状态是程序返回到调用程序或 shell 的数值。在 C 程序中,这由main()
函数的返回值或您赋予exit(3)
的值表示。数字中唯一重要的部分是最低有效 8 位,这意味着只有从0
到255
的值。
Code Description
0 success
1-255 failure (in general)
126 the requested command (file) can't be executed (but was found)
127 command (file) not found
128 according to ABS it's used to report an invalid argument to the exit
builtin, but I wasn't able to verify that in the source code of Bash
(see code 255)
128 + N the shell was terminated by the signal N (also used like this by
various other programs)
255 wrong argument to the exit builtin (see code 128)
0
125
的较低代码不是保留的,可用于程序喜欢报告的任何内容。值 0 表示成功终止,值不 0 表示终止失败。这种行为(== 0, != 0)
也是 Bash 在某些代码流控制语句(如if
或while
)中做出的反应。
以上摘录自Bash Hackers Wiki的退出状态部分。
您显示的列表确实是最接近"标准化"的,但坦率地说,它看起来比实际更合法。据我所知,几乎没有人太关注这些家伙,而是每个人都说出了自己的退出状态:
执行 test1.sh
#!/bin/bash
a=10 ; [ "$a" -eq 9 ] && echo "Cool!" || exit 200
输出:
:~$ test1.sh
:~$ echo $?
200