如果 shell 函数需要特定的 -e/+e 设置才能工作,是否可以在本地设置该设置,然后在退出该函数之前将其恢复为以前的设置?
myfunction()
{
# Query here if -e is set and remember in a variable?
# Or push the settings to then pop at the end of the function?
set +e
dosomething
doanotherthing
# Restore -e/+e as appropriate, don't just do unconditional set -e
}
答案1
您已在变量中设置了标志$-
,因此您可以在函数开始时保留它,然后在之后恢复它。
save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi
答案2
您可以通过变量 SHELLOPTS 读取标志值:
> set +e
> echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
> set -e
> echo $SHELLOPTS
braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor
您会看到,设置后,会出现中的set -e
值。您可以从那里检查它。errexit
$SHELLOPTS
但是,如果你愿意的话,你可以解决这个问题,只要记住以下几点:根据手册:
-e:
.....此选项分别适用于shell环境和每个子shell环境。
因此,如果你在子 shell 中执行你的函数,例如
zz="$(myfunction)"
您不必担心errexit
在调用环境中该变量是否被设置,您可以根据需要进行设置。
答案3
另一种方法是使用shopt
内置函数(使用-o
标志,从 访问正确的选项集set -o
;使用-q
标志,通过 的退出代码悄悄提供设置shopt
)。因此,如下所示:
# save the previous "set -e" setting
shopt -oq errexit && set_e_used=$? || set_e_used=$?
set +e
...your code here...
# restore the previous "set -e" setting
if [[ $set_e_used -eq 0 ]]; then
set -e
else
set +e
fi