为什么第三种情况是使用退出代码0返回成功?
case 1 ~$ bash -c 'set -e; false || true; echo success'; echo $?
success
0
case 2 ~$ bash -c 'set -e; true || false; echo success'; echo $?
success
0
case 3 ~$ bash -c 'set -e; false && true; echo success'; echo $?
success
0
case 4 ~$ bash -c 'set -e; true && false; echo success'; echo $?
1
case 5 ~$ bash -c 'set -e; false || false; echo success'; echo $?
1
case 6 ~$ bash -c 'set -e; false && false; echo success'; echo $?
success
0
答案 0 :(得分:4)
set -e
的{{3}}说:
如果失败的命令是
&&
或||
列表中执行的任何命令的一部分,那么shell不会退出,除了最后&&
之后的命令或||
,[...]
有问题的命令列表是false && true
。失败的命令是false
,它不是列表中的最后一个命令,因此shell不会退出。您0
看到的是echo success
的退出状态。
答案 1 :(得分:2)
set -e
有点微妙。
来自reference:
-e
当此选项打开时,任何命令失败(由于Shell错误的后果中列出的任何原因或返回退出 状态大于零),shell立即退出,好像是 使用没有参数执行exit特殊内置实用程序 以下例外:
- 多命令管道中任何单个命令的失败都不会导致shell退出。只有失败了 管道本身应予以考虑。
执行while,until,if或elif保留字后面的复合列表时,将忽略-e设置 一开始!保留字,或AND-OR列表的任何命令 除了最后一个。
- 醇>
如果在忽略-e时,除了子shell命令之外的复合命令的退出状态是失败的结果,那么 -e不适用于此命令。
此要求分别适用于shell环境和每个子shell环境。例如,在:
set -e; (false; echo one) | cat; echo two
false命令导致子shell退出而不执行echo one;但是,echo 2是因为退出状态而被执行的 管道(假; echo one)|猫是零。
由于false && true
是 AND或OR列表的一部分,false
不是最后一个, shell不会立即退出。
执行echo success
,返回代码为0
。
顺便问一下,您是否注意到案例6?
答案 2 :(得分:0)
true && false; echo success
返回echo
的返回码,即0。
bash -c 'false && true'; echo $?
按预期产生1
。 Pheew!
除此之外:bash -c 'set -e; false || false; echo success'; echo $?
会返回代码1
,因为第二个命令不会执行echo
(在false
处停止,因为错误会停止当前命令),请注意{{1}没有打印。