¿Es posible verificar si -e está configurado dentro de un script bash?

9

Si una función de shell necesita una configuración específica de -e / + e para funcionar, ¿es posible establecer esa configuración localmente y luego restaurarla a su configuración anterior antes de salir de la función?

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
fuente

Respuestas:

12

Actualmente tiene las marcas configuradas en la variable $-, por lo que puede conservar esto al comienzo de la función y restaurarlo después.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi
meuh
fuente
Cabe señalar que $-también funciona /bin/shy probablemente no necesite bashism para analizarlo, solo use, por ejemplo, globbing que caseproporciona
Josip Rodin
2

Puede leer el valor del indicador a través de 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

Verá que, después de configurar set -e, aparece el valor errexiten $SHELLOPTS. Puedes consultarlo desde allí.

Sin embargo, puede evitar esto (si lo desea) recordando el siguiente punto: de acuerdo con el Manual :

-e :

..... Esta opción se aplica al entorno de shell y a cada entorno de subshell por separado.

Por lo tanto, si ejecuta su función en una subshell, como

   zz="$(myfunction)"

no tiene que preocuparse si la errexitvariable está configurada o no en el entorno de llamada, y puede configurarla como desee.

MariusMatutiae
fuente
Gracias, SHELLOPTS es útil para tener en cuenta. Sin embargo, creo que $ - sugerido por @meuh es más fácil de verificar mediante programación, por eso acepté esa respuesta.
usta
La nota sobre las subcapas también es útil, pero quería evitar modificar los sitios de llamadas. De lo contrario, probablemente cambiaría las myfunctionllamadas a myfunction || truepara suprimir el efecto de -e para las llamadas y no tendría que hacerlo set +edentro de la función en primer lugar.
usta
@MariusMatutiae: 20000 felicitaciones.
Scott