È possibile verificare se -e è impostato in uno script bash?


9

Se una funzione shell necessita di un'impostazione specifica di -e / + e per funzionare, è possibile impostarla localmente e quindi ripristinarla alla sua impostazione precedente prima di uscire dalla funzione?

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
}

Risposte:


12

I flag sono attualmente impostati nella variabile $-, quindi è possibile mantenerlo all'inizio della funzione e ripristinarlo dopo.

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

Va notato che $-funziona anche /bin/she probabilmente non hai bisogno di basismi per analizzarlo, basta usare ad esempio il globbing che casefornisce
Josip Rodin,

2

Puoi leggere il valore del flag attraverso la variabile 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

Si vede che, dopo l'impostazione set -e, appare il valore errexitin $SHELLOPTS. Puoi controllarlo da lì.

Tuttavia, puoi aggirare questo (se lo desideri!) Ricordando il seguente punto: secondo il Manuale :

-e :

..... Questa opzione si applica all'ambiente shell e a ciascun ambiente subshell separatamente.

Pertanto, se si esegue la propria funzione in una subshell, come

   zz="$(myfunction)"

non devi preoccuparti se la errexitvariabile è impostata o meno nell'ambiente chiamante e puoi impostarla come preferisci.


Grazie, SHELLOPTS è utile essere consapevoli. Trovo $ - suggerito da @meuh più facile da controllare a livello di programmazione, ecco perché ho accettato quella risposta.
usta

Anche la nota sui subshells è utile, ma volevo evitare di modificare i siti di chiamata. Altrimenti probabilmente cambierei myfunctionchiamate per myfunction || truesopprimere l'effetto di -e per le chiamate e non dovrei fare prima set +ela funzione all'interno della funzione.
usta

@MariusMatutiae: 20000 congratulazioni.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.