函数的本地 `set -e`

函数的本地 `set -e`

是否有这样的功能或者可以很容易地模拟它吗?我想要相同的行为,除了它应该return在哪里set -e导致调用exit.

答案1

Sub shell 可能会有用。

func() {(set -e
        echo a
        ehco b
        echo c
)}

func
func
func

该脚本产生:

a
script.sh: line 3: ehco: command not found
a
script.sh: line 3: ehco: command not found
a
script.sh: line 3: ehco: command not found

或者您可能感兴趣bash 中的 try/catch 实现

答案2

您可以设置ERR陷阱,每当命令返回非零状态时就会执行该陷阱。

在 bash 中,这有点复杂,因为陷阱不是函数的本地函数。默认情况下,陷阱不会被子 shell 或子函数继承;打电话set -E来改变这个。这是一些演示代码。

#!/bin/bash

subroutine () {
  false
  echo "Subroutine continued after status $?"
}

trapper () {
  local i ret
  trap 'ret=$?
        echo "Command $BASH_COMMAND returned status $ret"
        for ((i=0; i<$((${#FUNCNAME[@]}-1)); i++)) do
          echo "  from ${FUNCNAME[$i]} at ${BASH_SOURCE[$((i+1))]} line ${BASH_LINENO[$((i+1))]}"
        done
        return $ret' ERR
  trap 'ret=$?; trap - ERR RETURN; return $ret' RETURN
  echo ok
  subroutine
  echo "By default, the ERR trap is not inherited"
  false
  echo "You won't see this"
}

main () {
  trapper
  echo "trapper returned status $?"
  false
  echo "still there"
}

main

在 zsh 中,您可以定义函数,而不是为(为了兼容性)或(在具有名为的信号的系统上TRAPZERR设置陷阱- 我不知道有任何)。但如果您只想立即返回(而不是打印错误消息),则更简单:只需设置选项即可。选项默认是全局的;设置选项以使它们成为调用函数的本地选项(如果在函数返回时设置了该选项,则恢复调用函数时的选项)。默认情况下,陷阱也是全局的。选项和陷阱在函数调用中继承。ERRZERRSIGERRerr_returnlocal_optionslocal_options

myfunction () {
  setopt local_options err_return
  false
  echo not executed
}

答案3

对于ksh93,如果您使用ksh自己的语法来定义函数 ( function f {...;}),则选项和陷阱具有本地作用域。所以,你可以这样做:

function f {
  trap 'return 99' ERR
  set -e
  echo foo
  false
  echo never output
}
f
echo "f exited with status $?"

这使:

foo
f exited with status 99

相关内容