Bash 5.2.15 在这里。
运行以下脚本,我希望回显不会运行。
#!/bin/bash
set -e
function func() {
(
exit 1
)
echo 'should not be run because of set -e'
}
func || true
它实际上已经运行了,这对我来说似乎是一个错误。
|| true
如果我在函数调用的站点上删除它,它(正确地)不会运行。
我的解释是“错误吞没”|| true
应用于代码的错误部分:就好像我将其写在与子 shell 的右括号相同的行上(但我没有)。
我错过了什么吗?
答案1
这是有记录的[强调矿]:
-e
如果管道(请参阅管道)(可能由单个简单命令(请参阅简单命令)、列表(请参阅命令列表)或复合命令(请参阅复合命令)组成)返回非零状态,请立即退出。&&
如果失败的命令是在或列表中执行的任何命令的 [...] 部分,则 shell 不会退出(最后一个或||
后面的命令除外),&&
||
[…]。如果子 shell 之外的复合命令由于命令在被忽略时失败而返回非零状态-e
,则 shell 不会退出。 […]
[…]
如果复合命令或 shell 函数在被忽略的上下文中执行
-e
,则在复合命令或函数体内执行的任何命令都不会受到该-e
设置的影响,即使-e
已设置并且命令返回失败状态。[…]
这意味着在你func || true
-e
被忽略之前||
和它在整个函数中被忽略。