É possível verificar se -e está definido em um script bash?

9

Se uma função shell precisar de uma configuração específica de -e / + e para funcionar, é possível definir essa configuração localmente e depois restaurá-la para a configuração anterior antes de sair da função?

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
fonte

Respostas:

12

Você tem os sinalizadores atualmente definidos na variável $-, portanto, você pode preservar isso no início da função e restaurá-lo depois.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi
meuh
fonte
Deve-se notar que $-também trabalha em /bin/she você provavelmente não precisa bashisms para analisá-lo, basta usar por exemplo englobamento que casefornece
Josip Rodin
2

Você pode ler o valor da flag através da variável 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

Você vê que, após a configuração set -e, o valor errexitem $SHELLOPTSaparece. Você pode conferir a partir daí.

No entanto, você pode contornar isso (se desejar!) Lembrando o seguinte ponto: de acordo com o Manual :

-e :

..... Esta opção se aplica ao ambiente do shell e a cada ambiente do subshell separadamente.

Portanto, se você executar sua função em um subshell, como

   zz="$(myfunction)"

você não precisa se preocupar se a errexitvariável está configurada ou não no ambiente de chamada e pode configurá-la como desejar.

MariusMatutiae
fonte
Obrigado, SHELLOPTS é útil. Acho $ - sugerido por @meuh mais fácil de verificar programaticamente, é por isso que aceitei essa resposta.
usta
A observação sobre subcascas também é útil, mas eu queria evitar modificar os sites de chamada. Caso contrário, eu provavelmente mudaria as myfunctionchamadas para myfunction || truesuprimir o efeito de -e para as chamadas e não teria que fazer set +edentro da função em primeiro lugar.
usta
@MariusMatutiae: 20000 parabéns.
Scott