Czy można sprawdzić, czy -e jest ustawione w skrypcie bash?


9

Jeśli funkcja powłoki wymaga określonego ustawienia -e / + e do działania, czy można ustawić to ustawienie lokalnie, a następnie przywrócić poprzednie ustawienie przed wyjściem z funkcji?

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
}

Odpowiedzi:


12

Masz ustawione flagi w zmiennej $-, więc możesz zachować to na początku funkcji i przywrócić ją później.

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

Należy zauważyć, że $-również działa /bin/shi prawdopodobnie nie potrzebujesz bashism, aby go przeanalizować, po prostu użyj np. Globbing, który casezapewnia
Josip Rodin

2

Możesz odczytać wartość flagi poprzez zmienną 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

Widzisz, po ustawieniu pojawia się set -ewartość errexitw $SHELLOPTS. Możesz to sprawdzić stamtąd.

Możesz jednak obejść ten problem (jeśli chcesz!), Pamiętając o następującym punkcie: zgodnie z instrukcją :

-e :

..... Ta opcja dotyczy środowiska powłoki i każdego środowiska podpowłoki osobno.

Zatem jeśli wykonasz swoją funkcję w podpowłoce, takiej jak

   zz="$(myfunction)"

nie musisz się martwić, czy errexitzmienna jest ustawiona w środowisku wywołującym, i możesz ustawić ją tak, jak chcesz.


Dzięki, SHELLOPTS warto wiedzieć. Uważam $ - sugerowany przez @meuh za łatwiejszy do programowego sprawdzenia, dlatego zaakceptowałem tę odpowiedź.
usta

Uwaga na temat podpowłoki jest również przydatna, ale chciałem uniknąć modyfikacji witryn wywołań. W przeciwnym razie prawdopodobnie zmieniłbym myfunctionwywołania, aby myfunction || truestłumić efekt -e dla wywołań i nie musiałbym zajmować set +esię funkcjami w pierwszej kolejności.
usta

@MariusMatutiae: 20000 gratulacje.
Scott,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.