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