我有一个这样的脚本,名为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 进程执行,并且$?
进程之间不共享。您可以通过创建judge
bash 函数来解决此问题:
[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 $?