列出所有带有描述的系统退出状态代码

时间:2017-03-18 09:04:20

标签: linux bash shell unix exit

我知道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

3 个答案:

答案 0 :(得分:2)

退出状态是程序返回给调用程序或shell的数值。在C程序中,这由main()函数的返回值或您赋予exit(3)的值表示。重要数字的唯一部分是最不重要的8位,这意味着只有0255的值。

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)

较低的代码0125不会保留,可用于程序喜欢报告的任何内容。值0表示成功终止,值0表示终止成功。此行为(== 0, != 0)也是Bash在ifwhile等代码流控制语句中所做的反应。

上述摘录摘自Exit StatusBash 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