Est-il possible de vérifier si -e est défini dans un script bash?

9

Si une fonction shell a besoin d'un paramètre spécifique de -e / + e pour fonctionner, est-il possible de définir ce paramètre localement, puis de le restaurer à son paramètre précédent avant de quitter la fonction?

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
la source

Réponses:

12

Les indicateurs sont actuellement définis dans la variable $-, vous pouvez donc les conserver au début de la fonction et les restaurer après.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi
meuh
la source
Il convient de noter que cela $-fonctionne également dans /bin/shet vous n'avez probablement pas besoin de bashismes pour l'analyser, utilisez simplement par exemple un globbing qui casefournit
Josip Rodin
2

Vous pouvez lire la valeur de l'indicateur via la variable 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

Vous voyez qu'après le réglage set -e, la valeur errexitdans $SHELLOPTSapparaît. Vous pouvez le vérifier à partir de là.

Cependant, vous pouvez contourner cela (si vous le souhaitez!) En vous rappelant le point suivant: selon le manuel :

-e :

..... Cette option s'applique à l'environnement shell et à chaque environnement sous-shell séparément.

Ainsi, si vous exécutez votre fonction dans un sous-shell, comme

   zz="$(myfunction)"

vous n'avez pas à vous soucier de savoir si la errexitvariable est définie ou non dans l'environnement d'appel, et vous pouvez la définir comme vous le souhaitez.

MariusMatutiae
la source
Merci, SHELLOPTS est utile d'être au courant. Je trouve que $ - suggéré par @meuh est plus facile à vérifier par programmation, c'est pourquoi j'ai accepté cette réponse.
usta
La note sur les sous-coquilles est également utile, mais je voulais éviter de modifier les sites d'appels. Sinon, je changerais probablement les myfunctionappels pour myfunction || truesupprimer l'effet de -e pour les appels et ne pas avoir à faire set +eà l'intérieur de la fonction en premier lieu.
usta
@MariusMatutiae: 20000 félicitations.
Scott