在布尔表达式中调用时,Bash函数会忽略错误吗?

时间:2016-07-01 20:52:48

标签: bash function

以下bash脚本打印“This should never run!”:

#!/bin/bash
set -e

func() {
    echo "Bailing out..."
    false # Should bail out because of set -e

    echo "This should never run!"
}

func || true

这里发生了什么?

一个简单的结论是set -e不会在函数内传播。然而,这种情况并非如此。将最后一行(func || true)更改为仅func会导致函数按预期停在false语句处。

另一个假设是bash将开始执行该函数,并在第一个错误(false)上评估它被调用的其余部分(func || true),如果那个返回0(true),然后继续执行该函数,好像什么都没发生一样。但是,将true替换为echo "Oops!"可以反驳这一点,因为没有“哎呀!”打印出来。

在将函数作为布尔表达式的一部分执行时,set -e会以某种方式被忽略吗?

1 个答案:

答案 0 :(得分:4)

关于man bash来自set -e

  

如果管道(可能包含单个简单命令),列表或复合命令(请参阅上面的SHELL GRAMMAR),则立即退出,并以非零状态退出。 如果失败的命令是紧跟在while或者直到关键字之后的命令列表的一部分,那么shell不会退出,在if或elif保留字之后的部分测试,任何命令的一部分在&&和或||列表除了最后一个&&之后的命令或者|| ,管道中的任何命令但是最后一个命令,或者命令的返回值是否被反转!如果子shell以外的复合命令返回非零状态,因为在忽略-e时命令失败,则shell不会退出。 ERR上的陷阱(如果已设置)将在shell退出之前执行。此选项分别适用于shell环境和每个子shell环境(请参阅上面的COMMAND EXECUTION ENVIRONMENT),并且可能会导致子shell在执行子shell中的所有命令之前退出。