表 E-1. 保留 退出码
退出码编号 | 含义 | 示例 | 注释 |
---|---|---|---|
1 | 通用错误的统称 | let "var1 = 1/0" | 各种错误,例如 "除以零" 和其他不允许的操作 |
2 | 滥用 shell 内置命令(根据 Bash 文档) | empty_function() {} | 缺少关键字或命令,或权限问题(以及 diff 在二进制文件比较失败时的返回码)。 |
126 | 调用的命令无法执行 | /dev/null | 权限问题或命令不是可执行文件 |
127 | "command not found" | illegal_command | 可能存在问题$PATH或拼写错误 |
128 | 传递给 exit 的参数无效 | exit 3.14159 | exit 仅接受 0 - 255 范围内的整数参数(参见第一个脚注) |
128+n | 致命错误信号 "n" | kill -9 $PPID脚本的 | $?返回 137 (128 + 9) |
130 | 脚本被 Control-C 终止 | Ctl-C | Control-C 是致命错误信号 2,(130 = 128 + 2,参见上文) |
255* | 退出状态超出范围 | exit -1 | exit 仅接受 0 - 255 范围内的整数参数 |
根据上表,退出码 1 - 2, 126 - 165, 和 255 [1] 具有特殊含义,因此应避免用于用户指定的退出参数。使用 exit 127 结束脚本肯定会在故障排除时造成混淆(错误代码是 "command not found" 还是用户定义的?)。然而,许多脚本使用 exit 1 作为一般的错误退出。由于退出码 1 表示许多可能的错误,因此它在调试中不是特别有用。
已经有人尝试系统化退出状态码(参见/usr/include/sysexits.h),但这适用于 C 和 C++ 程序员。对于脚本编写,类似的规范可能是合适的。本文档的作者建议将用户定义的退出码限制在 64 - 113 范围内(除了 0,表示成功),以符合 C/C++ 标准。这将分配 50 个有效代码,并使脚本故障排除更加直接。[2] 本文档随附示例中的所有用户定义的退出码均符合此标准,除非存在凌驾一切的情况,如 示例 9-2 中所示。
![]() | 在 shell 脚本退出后,从命令行发出 $? 得到的结果与上表一致,仅限于 Bash 或 sh 提示符。运行 C-shell 或 tcsh 在某些情况下可能会给出不同的值。 |
[1] | 超出范围的退出值可能会导致意外的退出码。大于 255 的退出值返回 模 256 的退出码。例如,exit 3809 给出退出码 225 (3809 % 256 = 225)。 |
[2] | 一个更新的/usr/include/sysexits.h分配了先前未使用的退出码,范围从 64 - 78。可以预见,未分配的退出码范围在未来将进一步缩小。本文档的作者将不会对脚本示例进行修复以符合不断变化的标准。这不应引起任何问题,因为编译后的 C/C++ 二进制文件和 shell 脚本之间在使用退出码方面没有重叠或冲突。 |