-e
设置选项时,我对 bash(和破折号)行为感到困惑。
简单的例子:
#!/bin/bash -e
func() {
false && true
}
false && true
echo "1"
func
echo "2"
Run Code Online (Sandbox Code Playgroud)
输出:
1
Run Code Online (Sandbox Code Playgroud)
预期输出:
1
2
Run Code Online (Sandbox Code Playgroud)
虽然第一次出现按预期工作,但第二次出现(在函数内部)会导致立即退出。我搜索了文档,但无法找到对这种不同行为的解释。这背后有什么理由吗,还是这个错误?我在 bash 和 dash 中对此进行了测试,结果相同。
根据 bash 联机帮助页:
-e
如果管道(可能由单个简单命令组成)、列表或复合命令(参见上面的 SHELL GRAMMAR)以非零状态退出,则立即退出。如果失败的命令是紧跟在所述命令列表的一部分的壳不退出while
或until
关键字,继该测试的一部分if
或elif
保留字,在执行任何命令的一部分&&
或||
除命令列表以下的最终&&
或||
,任何管道中的命令但最后一个,或者如果命令的返回值被!
. 如果除子 shell 之外的复合命令由于命令在-e
被忽略时失败而返回非零状态,则 shell 不会退出。一个陷阱ERR
,如果设置,在 shell 退出之前执行。此选项分别适用于 shell 环境和每个子 shell 环境(参见上面的命令执行环境),并且可能导致子 shell 在执行子 shell 中的所有命令之前退出。如果复合命令或 shell 函数在
-e
被忽略的上下文中执行,则在复合命令或函数体内执行的任何命令都不会受到-e …