是否有这样的功能或者可以很容易地模拟它吗?我想要相同的行为,除了它应该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
设置陷阱- 我不知道有任何)。但如果您只想立即返回(而不是打印错误消息),则更简单:只需设置选项即可。选项默认是全局的;设置选项以使它们成为调用函数的本地选项(如果在函数返回时设置了该选项,则恢复调用函数时的选项)。默认情况下,陷阱也是全局的。选项和陷阱在函数调用中继承。ERR
ZERR
SIGERR
err_return
local_options
local_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