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


9

如果外壳程序功能需要特定的-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
}

Answers:


12

您目前在变量中设置了标志$-,因此可以在函数开始时保留它,并在以后恢复它。

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi

应该注意的是,它$-也可以使用/bin/sh,您可能不需要bashisms来解析它,只需使用例如case提供以下内容的globbing
Josip Rodin

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中执行函数,例如

   zz="$(myfunction)"

您不必担心errexit在调用环境中是否设置了变量,可以根据需要进行设置。


谢谢,了解SHELLOPTS非常有用。我确实发现@meuh建议的$-更容易通过编程检查,这就是为什么我接受了这个答案。
usta 2015年

关于子外壳的注释也很有用,但我想避免修改调用站点。否则,我可能会更改myfunction调用以myfunction || true抑制-e对调用的影响,而不必set +e首先在函数内部进行操作。
usta 2015年

@MariusMatutiae:恭喜20000。
斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.