我知道shell中的$?
包含最后执行的程序exit status
。
例如,当我在命令下运行时,我看到了不同情况的不同状态。
test$ hello
-bash: hello: command not found
test$ echo $?
127
test$ expr 1 / 0
expr: division by zero
test$ echo $?
2
我想知道系统或互联网中是否有任何常见的退出状态列表,我可以通过其描述获得所有退出状态。我找到了一个列表here,但缺少一些代码,例如status code 127
。
答案 0 :(得分:2)
退出状态是程序返回给调用程序或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
等代码流控制语句中所做的反应。
上述摘录摘自Exit Status的Bash Hackers Wiki部分。
答案 1 :(得分:2)
可能没有全面的列表,因为命令退出状态的含义本质上是特定于命令的。对于给定的命令,您通常可以在相应命令的手册页和信息文档中获取有关此信息的信息。
在
的情况下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
表示'成功'或" true" /" truthy" 0
意味着(从广义上讲)'失败'或者'不成功'或" false" /" falsy" 正如您所看到的,这仍然留有很大的解释空间,这是完美的意图,因为这些含义必须特定于各个命令的上下文。 (考虑例如false
命令,其目的是"失败"因此总是返回非0
退出代码。)
您找到的list描述了系统调用的返回码。系统调用是指程序向内核发出请求(内)并且与命令调用不同,因此这些返回代码不一定(必须)与命令退出代码相同。
答案 2 :(得分:1)
您展示的列表实际上是与“标准化”最接近的可能性,但坦率地说它看起来比实际更合理。据我所知,几乎没有人关注这些人,而是每个人都说出自己的退出状态:
执行test1.sh
#!/bin/bash
a=10 ; [ "$a" -eq 9 ] && echo "Cool!" || exit 200
输出:
:~$ test1.sh
:~$ echo $?
200