Linux 为什么bash不在短路命令序列出现故障时停止?
当我使用Linux 为什么bash不在短路命令序列出现故障时停止?,linux,bash,shell,short-circuiting,Linux,Bash,Shell,Short Circuiting,当我使用-e选项运行bash脚本时,我看到一些行为对我来说没有意义,该选项有多个命令与&串在一起,其中一个失败。我希望脚本在失败的命令上停止并返回退出状态,但它只是愉快地执行脚本的其余部分 以下是一些对我有意义的例子: $ false && true; echo $? 1 $ bash -xe -c "false && true"; echo $? + false 1 $ bash -xe -c "false; true"; echo $? + false 1
-e
选项运行bash脚本时,我看到一些行为对我来说没有意义,该选项有多个命令与&
串在一起,其中一个失败。我希望脚本在失败的命令上停止并返回退出状态,但它只是愉快地执行脚本的其余部分
以下是一些对我有意义的例子:
$ false && true; echo $?
1
$ bash -xe -c "false && true"; echo $?
+ false
1
$ bash -xe -c "false; true"; echo $?
+ false
1
$ bash -xe -c "false && true; true"; echo $?
+ false
+ true
0
这是一个对我来说毫无意义的问题:
$ false && true; echo $?
1
$ bash -xe -c "false && true"; echo $?
+ false
1
$ bash -xe -c "false; true"; echo $?
+ false
1
$ bash -xe -c "false && true; true"; echo $?
+ false
+ true
0
这就是我不明白发生了什么的地方false&&true
返回状态1,那么脚本不应该停止执行并返回状态1,就像脚本为false时那样;是否正确
在试验过程中,我发现如果我用括号括住命令链,它的工作方式与我预期的一样:
$ bash -xe -c "(false && true); true"; echo $?
+ false
1
有人能解释一下吗?这里的逻辑是,您对
&&
的使用已经是错误检查了。同样,bash不会将if
条件中的故障视为值得中止的故障,即使使用set-e
当您将命令括在括号中时,实际上是在子shell中运行这些命令,因此脚本本身只看到该子shell的返回,即:它根本不知道涉及到
&&
,因此它会按预期中止。quot参考手册:
如果失败的命令是紧跟在while或until关键字之后的命令列表的一部分、if语句中的测试的一部分、在&&或| |列表中执行的任何命令的一部分(除了最后一个&&或| | |之后的命令、管道中的任何命令,但最后一个命令除外),则shell不会退出,或者,如果命令的返回状态被转换为
为了避免在计算false条件时退出bash脚本(具有
set-e
),使用If-else语句比使用其他语句更安全
但是,如果您喜欢较短的语法(如我;-),请替换:
[[condition]]&&command
与:
[[!条件]]||命令
举例说明:
$ false && do_whatever ; echo rc=$?
rc=1 # i.e. Will exit bash at this point
$ ! false || do_whatever ; echo rc=$?
rc=0 # i.e. Bash will continue...
这实际上很有道理。我知道如果是那样工作的话,
,但是我从来没有想到bash会以同样的方式对待&
。