Чи можна перевірити, чи встановлено -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і вам, ймовірно, не потрібні башизми для їх розбору, просто використовуйте, наприклад, глобус, який caseзабезпечує
Йосип Роден

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всередині функції в першу чергу.
usta

@MariusMatutiae: 20000 привітань.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.