函数中子 shell 的退出代码处理不当

函数中子 shell 的退出代码处理不当

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被忽略之前||它在整个函数中被忽略。

相关内容