8

Если для работы функции оболочки требуется определенный параметр -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
}

2 ответа2

8

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .