linux进程退出码是0–255的整数,由exit()或main()返回值决定,0表成功、非0表失败;$?获取时取模256,负数转为255等效值,被信号终止则为128+信号号。

Linux进程退出码(Exit Status)是一个0到255之间的整数,由进程终止时通过exit()系统调用或return从main()函数返回的值决定。它用于向父进程(比如shell)反馈执行结果:0通常表示成功,非0表示某种失败或异常状态。
退出码的基本规则
Shell中运行命令后,可用$?获取其退出码。这个值是进程实际返回值对256取模的结果(因为底层用一个字节存储),所以:
- 返回256、512等等价于0;返回257等价于1
- 负数会自动转为无符号字节值,例如
return -1等价于255 - 被信号终止的进程,退出码为128 + 信号编号(如
kill -9→ 137)
常见退出码含义
POSIX标准未强制规定非零码的具体语义,但约定俗成有部分通用含义:
- 0:成功
- 1:通用错误(如语法错、参数无效)
- 2:误用内置命令(bash手册明确指定)
- 126:命令不可执行(权限不足或不是可执行文件)
- 127:命令未找到(路径中不存在该程序)
- 128+n:被信号n终止(如130=Ctrl+C,137=SIGKILL)
在Shell脚本中判断退出码
不要只依赖$?,推荐用if直接判断命令本身,更简洁安全:
- 写法:
if cmd; then echo "ok"; else echo "fail"; fi - 等价于:
cmd; if [ $? -eq 0 ]; then ... fi,但前者避免了中间变量干扰 - 需要区分多种失败原因时,再显式检查
$?,例如:
ls /nonexistent case $? in 2) echo "Permission denied" ;; 127) echo "Command not found" ;; *) echo "Other error" ;; esac
编写健壮脚本的小建议
退出码是脚本间通信的关键接口,设计时需注意:
- 自己的脚本应主动用
exit N返回有意义的码,而非依赖最后一条命令的默认值 - 调用外部命令前,先确认其是否支持你所依赖的退出码语义(如
grep的1和2含义不同) - 避免用
set -e盲目中断——它对管道、条件判断等有例外行为,易引发意外退出 - 调试时加
set -x可看到每条命令及对应退出码











