假设我们有一个这样的脚本。
#!/bin/bash
set -e
ls notexist && ls notexist
echo still here
由于set -e ,不会退出
但
#!/bin/bash
set -e
ls notexist || ls notexist
echo still here
意愿。 为什么呢?
答案 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”,并且永远不会到达第二个(最后一个)。
顺便说一句,使用true
和false
代替ls notexist
等特定命令进行此类测试更容易,更可靠。