是否可以检查 bash 脚本中是否设置了 -e?

是否可以检查 bash 脚本中是否设置了 -e?

如果 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

相关内容