Можно ли проверить, установлен ли -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
}

Ответы:


12

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

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

Следует отметить, что это $-также работает, /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установлена ли переменная в вызывающей среде или нет, и вы можете установить ее, как вам нравится.


Спасибо, SHELLOPTS полезно знать. Я считаю, что $ - предложенный @meuh легче проверить программно, поэтому я принял этот ответ.
Уста

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

@MariusMatutiae: 20000 поздравлений.
Скотт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.