为何Bash脚本无法获取前置命令的返回码?如何解决?
问题描述
执行以下命令时,因为beep未安装,返回码显示为127:
$ beep; echo $? Command 'beep' not found, but can be installed with: apt install beep Please ask your administrator. 127
接着创建test.sh脚本,内容如下:
$ cat test.sh #!/usr/bin/env bash echo $?
预期执行beep; ./test.sh时,脚本会输出127,但实际结果却是:
$ beep; ./test.sh Command 'beep' not found, but can be installed with: apt install beep Please ask your administrator. 0
疑问:为什么脚本输出的返回码和预期不符?怎么让Bash脚本获取到前置执行命令的返回码?
解答
为什么返回码不符?
$?是Shell进程的特殊变量,只存储当前Shell进程中最后一条执行命令的返回码。当你执行beep; ./test.sh时,./test.sh会启动一个全新的Bash子进程——这个子进程有自己独立的运行环境,它内部的$?和父进程的$?完全没关系。子进程启动后第一条执行的命令就是echo $?,此时子进程还没执行过其他命令,$?默认是0(表示子进程自身启动成功),所以输出0。
如何让脚本获取前置命令的返回码?
有两种实用方法:
方法1:通过命令行参数传递
执行命令时直接把前置命令的返回码作为参数传给脚本:
beep; ./test.sh $?
修改test.sh内容,读取第一个参数:
#!/usr/bin/env bash echo $1
执行后脚本就会输出beep的返回码127。
方法2:通过环境变量传递
先把返回码存入环境变量,再执行脚本:
beep; export BEEP_EXIT=$?; ./test.sh
修改test.sh读取这个环境变量:
#!/usr/bin/env bash echo $BEEP_EXIT
这种方式适合需要传递多个状态值的场景。
内容的提问来源于stack exchange,提问作者notacorn
相关产品推荐
相关产品推荐

