为什么"假&&真"不能在Bash中使用set -e退出?

时间:2017-01-02 21:10:13

标签: bash boolean

为什么第三种情况是使用退出代码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

3 个答案:

答案 0 :(得分:4)

set -e的{​​{3}}说:

  

如果失败的命令是&&||列表中执行的任何命令的一部分,那么shell不会退出,除了最后&&之后的命令或||,[...]

有问题的命令列表是false && true。失败的命令是false,它不是列表中的最后一个命令,因此shell不会退出。您0看到的是echo success的退出状态。

答案 1 :(得分:2)

set -e有点微妙。

来自reference

  

-e

     

当此选项打开时,任何命令失败(由于Shell错误的后果中列出的任何原因或返回退出   状态大于零),shell立即退出,好像是   使用没有参数执行exit特殊内置实用程序   以下例外:

     
      
  1. 多命令管道中任何单个命令的失败都不会导致shell退出。只有失败了   管道本身应予以考虑。
  2.   
  3. 执行while,until,if或elif保留字后面的复合列表时,将忽略-e设置   一开始!保留字,或AND-OR列表的任何命令   除了最后一个。

  4.   
  5. 如果在忽略-e时,除了子shell命令之外的复合命令的退出状态是失败的结果,那么   -e不适用于此命令。

  6.         

    此要求分别适用于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}没有打印。