为什么脚本开始时退出状态始终为 0?

为什么脚本开始时退出状态始终为 0?

我有一个这样的脚本,名为judge

#!/bin/bash
echo "last exit status is $?"

它始终输出“最后退出状态为 0”。例如:

ls -l;   judge # correctly reports 0
ls -z;   judge # incorrectly reports 0
beedogs; judge # incorrectly reports 0

为什么?

答案1

每行代码都有不同的 bash 进程执行,并且$?进程之间不共享。您可以通过创建judgebash 函数来解决此问题:

[root@xxx httpd]# type judge
judge is a function
judge ()
{
    echo "last exit status is $?"
}
[root@xxx httpd]# ls -l / >/dev/null 2>&1; judge
last exit status is 0
[root@xxx httpd]# ls -l /doesntExist >/dev/null 2>&1; judge
last exit status is 2
[root@xxx httpd]#

答案2

正如评论中所讨论的, $?变量保存最后一个向 shell 返回值的进程的值。

如果judge需要根据先前的命令状态执行某些操作,您可以让它接受一个参数,并传入状态。

#!/bin/bash
echo "last exit status is $1"
# Or even 
return $1

所以:

[cmd args...]; judge $?

相关内容