¿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
}

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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.