为什么在没有(!)的函数中禁用bash -e

Loi*_*ary 2 bash

注意:如果您正在寻找一种解决方法,因为set -e在函数中不起作用,请转到函数中的"set -e".这个问题是为什么它不能按预期工作.

当在GNU bash上运行以下版本时,版本4.1.5(1) - 释放:

  set -ex

  PS4=' ${FUNCNAME[0]}: $LINENO: '

  function f() {
      set -e
      false
      echo $@
  }

  ! f why does it display ? It should stop because of -e
  f
Run Code Online (Sandbox Code Playgroud)

它显示

 : 11: f why does it display '?' It should stop because of -e
 f: 6: set -e
 f: 7: false
 f: 8: echo why does it display '?' It should stop because of -e
why does it display ? It should stop because of -e
 : 12: f
 f: 6: set -e
 f: 7: false
Run Code Online (Sandbox Code Playgroud)

我希望它永远不会超过错误,因为-e意味着"当命令具有非零退出状态时退出".我知道这-e有一个棘手的行为,如http://mywiki.wooledge.org/BashFAQ/105中所述,但我想了解在这个特定情况下会发生什么.我正在使用-e它,并证明在许多非常简单的场景中最有用.这种情况有点棘手但如果可以解释我可以在每一行之后使用-e而不是添加|| exit 1.

小智 5

虽然试图解决一个类似的问题,我读手册页set -e:

-e errexit

如果一个简单的命令以非零状态退出,则立即退出,除非失败的命令是until或while循环的一部分,if语句的一部分,&&或者||列表的一部分,或者命令的返回状态是否被反转使用!.

注意关于返回状态被倒置的最后一位.我猜函数的逻辑否定f必须影响set -e该函数的行为.