设置-e时设置bash脚本的原因和&&连接的两个管道连接起来失败

时间:2013-07-23 09:29:47

标签: linux bash pipeline

假设我们有一个这样的脚本。

#!/bin/bash
set -e
ls notexist && ls notexist
echo still here
由于set -e

不会退出

#!/bin/bash
set -e
ls notexist || ls notexist
echo still here

意愿。 为什么呢?

2 个答案:

答案 0 :(得分:3)

bash手册对set -e说:

The shell does not exit if the command that fails is [...]
part of any command executed in a && or || list except the
command following the final && or ||

破折号手册说:

If not interactive, exit immediately if any untested command fails.
The exit status of a command is considered to be explicitly tested
if the command is used to control an if, elif, while, or until;
or if the command is the left hand operand of an “&&” or “||” operator.

对于 AND 测试,shell将在“左手操作数”测试期间提前停止。 因为还有测试,它会认为整个命令被“测试”,因此不会中止。

对于 OR 测试,shell必须运行所有(两个)测试,并且一旦最后一个测试失败,它将得出结论是存在未经检查的错误,因此将中止。

我同意这有点违反直觉。

答案 1 :(得分:1)

因为正如Bash手册所说的关于set -e

  

如果失败的命令是命令的一部分,则shell不会退出   列出一段时间或直到关键字,测试的一部分   跟随if或elif保留字,是在a中执行的任何命令的一部分   &安培;&安培;或||列表除了最后一个&&之后的命令或||,任何命令   在管道中但是最后一个,或者命令的返回值是什么   倒了!。

ls notexist || ls notexist命令终止shell,因为第二个(最后一个)ls notexist退出失败。 ls notexist && ls notexist不会终止shell,因为在第一个ls notexist失败后会停止执行“&& list”,并且永远不会到达第二个(最后一个)。

顺便说一句,使用truefalse代替ls notexist等特定命令进行此类测试更容易,更可靠。