linux退出状态码及exit命令
Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用$?变量。它的值会变成由shell所执行的最后一条命令的退出状态码:
[root@host1 test]# date 2017年 07月 19日 星期三 16:32:51 CST [root@host1 test]# echo $? 0
按照惯例,一个成功结束的命令的退出状态码是0。如果一个命令结束时有错误,退出状态码就是一个正数值(1-255):
[root@host1 test]# qwert -bash: qwert: command not found [root@host1 test]# echo $? 127
无效命令会返回一个退出状态码127。Linux错误退出状态码没有什么标准可循,但有一些可用的参考,如下所示:
Linux退出状态码
状 态 码 描 述
0 命令成功结束
1 一般性未知错误
2 不适合的shell命令
126 命令不可执行
127 没找到命令
128 无效的退出参数
128+x 与Linux信号x相关的严重错误
130 通过Ctrl+C终止的命令
255 正常范围之外的退出状态码
退出状态码126表明用户没有执行命令的正确权限:
[root@host1 test]# ./expect.sh -bash: ./expect.sh: 权限不够 [root@host1 test]# echo $? 126
另一个会碰到的常见错误是给某个命令提供了无效参数:
[root@host1 test]# cd % -bash: cd: %: 没有那个文件或目录 [root@host1 test]# echo $? 1
这会产生一般性的退出状态码1,表明在命令中发生了未知错误。
默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出:
[root@host1 test]# sh test.sh This is a test file [root@host1 test]# echo $? 0
你可以改变这种默认行为,返回自己的退出状态码。exit命令允许你在脚本结束时指定一个退出状态码:
[root@host1 test]# cat test.sh #!/bin/bash A=10 B=20 C=$[$A + $B] echo the number is $C exit $C [root@host1 test]# sh test.sh the number is 30 [root@host1 test]# echo $? 30
这里直接使用了C的值为exit的退出值,也可以直接指定exit 30,这都是对的;但是你要注意这个功能,因为退出状态码最大只能是255。看下面例子中会怎样:
[root@host1 test]# cat test.sh #!/bin/bash A=10 B=30 C=$[$A * $B] echo the number is $C exit $C [root@host1 test]# sh test.sh the number is 300 [root@host1 test]# echo $? 44
退出状态码被缩减到了0~255的区间,shell通过模运算得到这个结果。一个值的模就是被除后的余数。最终的结果是指定的数值除以256后得到的余数。在这个例子中,指定的值是300(返回值),余数是44,因此这个余数就成了最后的状态退出码。