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

8

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, em seguida, restaurá-la para sua 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
}
    
por usta 08.11.2015 / 16:26

2 respostas

8

Você tem os sinalizadores atualmente definidos na variável $- , para que você possa preservar essa no início da função e restaure depois.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi
    
por 08.11.2015 / 17:20
1

Você pode ler o valor do sinalizador 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ê verá que, depois de definir set -e , o valor errexit em $SHELLOPTS será exibido. Você pode verificar a partir daí.

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

-e:

..... This option applies to the shell environment and each subshell environment separately.

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

   zz="$(myfunction)"

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

    
por 08.11.2015 / 17:42