`set -e` 在 bash 函数中

Ale*_*lls 6 bash shell-script bash-functions

难道set -e不同的表现在这里

set -e;

function foo {

}
Run Code Online (Sandbox Code Playgroud)

对比

function foo {
  set -e;

}
Run Code Online (Sandbox Code Playgroud)

set -e属于内部的功能呢?set -e在函数外部声明是否会影响 shell 文件中的“嵌套”函数?反过来呢?我们应该叫local set -elol吗?

B L*_*yer 8

注意:此处的声明适用于 Bash 4.0.35 及更高版本。的实现set -e 在不同的 shell/版本之间差异很大。遵循Stéphane 的建议,不要使用set -e.

man bash在 Shell 内置命令/set部分中,虽然文本有点密集并且需要一点重点,但对事情的解释非常好。对于您的具体问题,答案是:

  • set -e这里的行为是否有所不同......与.. - 取决于你所说的“不同”是什么意思,但我怀疑你会考虑答案“不”......没有棘手的范围规则。它的行为非常线性。
  • set -e 是否属于函数内部?- 完全有效。
  • 在函数外部声明的 set -e 是否会影响 shell 文件中的“嵌套”函数?- 是的
  • 反过来呢?-set -e在函数中,然后在返回后遇到非零状态?是的,这将退出。

  • 不同版本之间存在不同的复杂规则。有关详细信息,请参阅 http://mywiki.wooledge.org/BashFAQ/105 和链接页面。最好远离“set -e”。 (2认同)

Ale*_*lls -2

避免头痛的解决方案:

function foo {
  (
       set -e;
  )
}
Run Code Online (Sandbox Code Playgroud)

(只需使用子外壳)。有时为了让它既令人困惑又美观,我会这样做:

 function foo {(
      set -e;
      # the rest goes here
  )}
Run Code Online (Sandbox Code Playgroud)