如果在条件

时间:2018-01-11 16:13:48

标签: bash

我正在试图找出为什么如果失败的块在条件链中,则错误保释行为-e不起作用:

#!/bin/bash
set -e
{       echo "First"
        ls blat
        echo "(this should not print)"
}

打印出来:

First
ls: cannot access 'blat': No such file or directory

这是正确的。

以下内容:

#!/bin/bash
set -e
{       echo "First"
        ls blat
        echo "(this should not print)"
} || echo "Encountered an error"

打印出来:

First
ls: cannot access 'blat': No such file or directory
(this should not print)

我希望打印Encountered an error而不是this should not print

有人可以向我解释这种差异的原因吗?

1 个答案:

答案 0 :(得分:1)

从文档(强调我的):

  

shell不会退出                         如果失败的命令是紧接着一段时间或直到命令列表的一部分                         关键字,if或elif保留字后面的测试的一部分,执行的任何命令的一部分                         在&&或||列表除了最终&&之后的命令或||,管道中的任何命令                         但是最后一个,或者命令的返回值是否被反转!。

由于ls是作为{...}列表的非最终部分执行的||复合的一部分,因此当ls具有非routerLink时,脚本不会退出零退出状态。