2017-03-18 94 views
1

我知道$?来自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

回答

2

可能没有全面的列表,因为命令退出状态的含义本质上是命令特定的。对于给定的命令,通常可以在各个命令的手册页和Info文档中获取有关此信息。

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-shells“),但是除非一个命令要符合这些约定之一(并且可能存在多个相互冲突的约定),命令的作者完全可以自由决定他们想要退出状态代码意思是说。

有一个重要的例外:所有UNIX命令应该坚持这种松散的规则成为好公民,并提供有意义的可组合性(与管道例如)在命令行上:

  • 0手段“成功”或“真” /“truthy”
  • 0手段(在非常广泛的意义),“失败”或“非成功”或“假” /“falsy”

正如你所看到的,THI这仍然留下了很多解释的空间,这是完全有意的,因为这些含义必须是针对单个命令的上下文而言的。 (例如考虑的false命令,具有非常宗旨,以“失败”,因此总是返回非0退出代码。)

list您发现描述返回代码系统调用。系统调用是指程序向内核发出一个请求,并且与命令调用不同,因此这些返回代码不一定与命令退出代码相同。

+2

值得注意的是,1的退出状态几乎总是*表示“一般错误”,而不是指示任何特定类型的错误。 – chepner

1

你展示的清单实际上是“标准化”最接近的事情,但坦率地说,它看起来比实际更合理。据我所知,几乎没有人非常重视这些人,而是每一个人的名字自己的退出状态:

执行test1.sh

#!/bin/bash 
a=10 ; [ "$a" -eq 9 ] && echo "Cool!" || exit 200 

输出:

:~$ test1.sh 
:~$ echo $? 
200 
+1

人们对该清单给予了足够的关注;它只是不是一个进程退出状态列表,而是一个系统调用返回值列表。 – chepner

1

退出状态是程序返回到调用程序或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 Status的部分从Bash Hackers Wiki