Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么bash不在短路命令序列出现故障时停止?_Linux_Bash_Shell_Short Circuiting - Fatal编程技术网

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会以同样的方式对待
&