Linux 退出状态码
Linux shell 中运行的每一个命令都使用 退出状态码 来告诉shell命令已运行完毕。退出状态码值 0~255。
Linux 提供了一个专门的变量 $? 来保存上一个执行命令的退出状态码。
zzz@ubuntu:~/my_learning$ echo $?
0
zzz@ubuntu:~/my_learning$ pwd
/home/zzz/my_learning
zzz@ubuntu:~/my_learning$ echo $?
0
zzz@ubuntu:~/my_learning$ pwds
Command 'pwds' not found, did you mean:
command 'pwdx' from deb procps (2:3.3.16-1ubuntu2.3)
command 'pwd' from deb coreutils (8.30-3ubuntu2)
command 'pads' from deb pads (1.2-12)
command 'pods' from deb pmtools (2.2.0-1)
Try: sudo apt install <deb name>
zzz@ubuntu:~/my_learning$ echo $?
127
zzz@ubuntu:~/my_learning$
可以看到,当命令正确执行完毕后,退出状态码是0。如果命令结束时有错误,退出状态码是正值。
一些常见的状态码含义:
状态码 | 描述 |
---|---|
0 | 命令成功结束 |
1 | 一般性未知错误 |
2 | 不适合的shell命令 |
126 | 命令不可执行 |
127 | 没找到命令 |
128 | 无效的退出参数 |
128+x | 与Linux信号x相关的严重错误 |
130 | 通过Ctrl+C终止的命令 |
255 | 正常范围之外的退出状态码 |
指定退出状态码
默认情况下,shell脚本会以脚本的最后一个命令的退出状态码退出。但是,可以使用 exit 命令来指定退出状态码。
zzz@ubuntu:~/my_learning$ vim test.sh
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
a=1
zzz@ubuntu:~/my_learning$ . test.sh
zzz@ubuntu:~/my_learning$ echo $?
0
zzz@ubuntu:~/my_learning$ vim test.sh
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
a=1
exit 10
zzz@ubuntu:~/my_learning$ bash test.sh
zzz@ubuntu:~/my_learning$ echo $?
10
zzz@ubuntu:~/my_learning$
zzz@ubuntu:~/my_learning$ vim test.sh
zzz@ubuntu:~/my_learning$ cat test.sh
#!/bin/bash
a=1
exit 300
zzz@ubuntu:~/my_learning$ chmod u+x test.sh
zzz@ubuntu:~/my_learning$ ./test.sh
zzz@ubuntu:~/my_learning$ echo $?
44
zzz@ubuntu:~/my_learning$
可以看到,当指定的退出状态码的值超过255的范围时,会被缩减到0~255之间。最终的结果将是指定的值除以256后得到的余数。