在 if 语句中捕获 bash 退出代码
Catch bash exit code in if statement
如果我直接使用单个命令对退出代码进行简单测试:
[user@localhost ~]$ date
Tue Sep 8 14:00:11 CEST 2020
[user@localhost ~]$ echo $?
0
[user@localhost ~]$ dat
bash: dat: command not found...
[user@localhost ~]$ echo $?
127
但是如果我想让它们进入 if 语句,我看到对于退出代码 0,输出是可以的,但是,对于“找不到命令”代码(应该是 127)它 returns "1".
[user@localhost ~]$ date
Tue Sep 8 14:02:18 CEST 2020
[user@localhost ~]$ if [ $? -eq 0 ]; then echo "Success: $?"; else echo "Failure: $?" >&2; fi
Success: 0
[user@localhost ~]$ dat
bash: dat: command not found...
[user@localhost ~]$ if [ $? -eq 0 ]; then echo "Success: $?"; else echo "Failure: $?" >&2; fi
Failure: 1
我错过了什么?
每个命令都有自己的退出状态,因此命令 [
1 将覆盖 $?
。为防止这种情况,将退出代码保存到一个变量中,并在 if 语句中使用它;
le=$?
if [ "$le" -eq 0 ]; then echo "Success: $le"; else echo "Failure: $le" >&2; fi
1:
单括号 [
实际上是测试命令的别名,它不是语法。有关详细信息,请查看此 comment on unix.stackexchange
如果您想捕获并打印每个命令的退出代码,我不会费心将它保存在变量中。仅当您稍后再次需要此退出代码,或者如果有一些您不认为是错误的 non-zero 退出代码时,才需要这样做。
相反,我会这样做:
替换现有的
command_to_verify
来自
if command_to_verify
then
echo Success
else
echo Failure: $?
fi
如果我直接使用单个命令对退出代码进行简单测试:
[user@localhost ~]$ date
Tue Sep 8 14:00:11 CEST 2020
[user@localhost ~]$ echo $?
0
[user@localhost ~]$ dat
bash: dat: command not found...
[user@localhost ~]$ echo $?
127
但是如果我想让它们进入 if 语句,我看到对于退出代码 0,输出是可以的,但是,对于“找不到命令”代码(应该是 127)它 returns "1".
[user@localhost ~]$ date
Tue Sep 8 14:02:18 CEST 2020
[user@localhost ~]$ if [ $? -eq 0 ]; then echo "Success: $?"; else echo "Failure: $?" >&2; fi
Success: 0
[user@localhost ~]$ dat
bash: dat: command not found...
[user@localhost ~]$ if [ $? -eq 0 ]; then echo "Success: $?"; else echo "Failure: $?" >&2; fi
Failure: 1
我错过了什么?
每个命令都有自己的退出状态,因此命令 [
1 将覆盖 $?
。为防止这种情况,将退出代码保存到一个变量中,并在 if 语句中使用它;
le=$?
if [ "$le" -eq 0 ]; then echo "Success: $le"; else echo "Failure: $le" >&2; fi
1:
单括号 [
实际上是测试命令的别名,它不是语法。有关详细信息,请查看此 comment on unix.stackexchange
如果您想捕获并打印每个命令的退出代码,我不会费心将它保存在变量中。仅当您稍后再次需要此退出代码,或者如果有一些您不认为是错误的 non-zero 退出代码时,才需要这样做。
相反,我会这样做:
替换现有的
command_to_verify
来自
if command_to_verify
then
echo Success
else
echo Failure: $?
fi