Можно ли проверить, установлен ли -e в скрипте bash?

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
}
USTA
источник

Ответы:

12

В настоящий момент в переменной установлены флаги $-, поэтому вы можете сохранить это в начале функции и восстановить ее после.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi
meuh
источник
Следует отметить, что это $-также работает, /bin/shи вам, вероятно, не нужны bashisms для его анализа, просто используйте, например, globbing, который caseобеспечивает
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. Вы можете проверить это оттуда.

Тем не менее, вы можете обойти это (если хотите!), Помня следующий пункт: согласно Руководству :

:

..... Этот параметр применяется к среде оболочки и каждой среде подоболочки отдельно.

Таким образом, если вы выполняете свою функцию в подоболочке, как

   zz="$(myfunction)"

вам не нужно беспокоиться о том, errexitустановлена ли переменная в вызывающей среде или нет, и вы можете установить ее, как вам нравится.

MariusMatutiae
источник
Спасибо, SHELLOPTS полезно знать. Я считаю, что $ - предложенный @meuh легче проверить программно, поэтому я принял этот ответ.
Уста
Замечание о подоболочках тоже полезно, но я хотел избежать изменения сайтов вызовов. В противном случае я бы, вероятно, изменил бы myfunctionвызовы на, myfunction || trueчтобы подавить эффект -e для вызовов, и set +eв первую очередь не пришлось бы делать это внутри функции.
Уста
@MariusMatutiae: 20000 поздравлений.
Скотт