Linux 中的 Bash 退出码

什么是退出代码(exit code)

每个脚本、命令或者二进制文件都带有返回码退出。
我们可以在特殊变量 $? .返回代码是数字,并且限制在 0-255 之间,因为使用了无符号 8 位整数。
如果我们使用值 -1,它将返回 255.
每次执行都以退出代码终止,无论成功与否,带有错误消息或者静默。
例如:

$ date ; echo $?
Sat Jan 18 08:06:07 IST 2020
0

如我们所见,退出代码为 0,因为该命令的执行没有问题。
现在,让我们试试这个:

$ wrngcmd ; echo $?
-bash: wrngcmd: command not found
127

这是一个没有找到的命令,因为我们只是输入了一堆毫无意义的字符。

之路教程 https://onitr oad .com

保留的 Bash 退出代码

与表示命令成功的退出代码“0”类似,bash 为不同情况保留了一些退出代码。
因此,理想情况下,如果我们在脚本中使用 exit 命令并需要指定退出代码,请不要使用这些保留的退出代码,因为它们可能会产生冲突结果。

退出代码数字含义例子注释
1捕获一般错误让 "var1 = 1/0"杂项错误,如 "divide by zero" 和其他不允许的操作
2滥用 shell 内置函数empty_function() {}缺少关键字或者命令
126调用的命令无法执行/开发/空权限问题或者命令不是可执行文件
127"找不到命令"非法命令$PATH 可能有问题或者打字错误
128退出的无效参数退出 3.14159exit 只接受 0 - 255 范围内的整数参数; (见第一个脚注)
128 +n致命错误信号 "n"kill -9 $PPID 脚本$? 返回 137 (128 + 9)
130由 Control-C 终止的脚本Ctrl-CControl-C 是致命错误信号 2,(130 = 128 + 2,见上)
255*退出状态超出范围退出 -1exit 只接受 0 - 255 范围内的整数参数; 255

让我们通过一个例子来理解退出代码“128 +n”。
运行永无止境的循环,如下所示:

#!/bin/bash    
while true; do    
echo ${$}    
done

如果我们运行此脚本,它将无限期地打印相同的 PID,直到我们杀死它或者执行“CTRL+C”。
让我们尝试执行“CTRL+C”并查看退出代码是什么。

# sh test.sh
....
2582
2582
2582
2582
2582
2582
^C
onitroad$ echo $?
130

如我们所见,退出代码是“128+2”,例如:130。
同样,如果我们使用“kill -9”杀死脚本,退出代码应该是“128+9”,例如:137.
让我们看一个例子:

# sh test.sh
....
2582
2582
2582
...
# kill -9 [pid_of_script]
....
2602
2602
Killed: 9
onitroad$ echo $?
137
日期:2020-09-17 00:14:20 来源:oir作者:oir