Eu li muitas perguntas em vários sites de troca de pilha e fóruns de ajuda unix sobre como modificar opções de shell e restaurá-las -
o mais abrangente que encontrei aqui é em Como desfazer um conjunto -x '?
A sabedoria recebida parece ser a de salvar o resultado de set +o
ou shopt -po
e então eval
depois para restaurar as configurações anteriores.
No entanto, no meu próprio teste com o bash 3.xe 4.x, a opção errexit
não é salva corretamente ao fazer a substituição do comando.
Aqui está um script de exemplo para mostrar o problema:
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
E saída (aparentei algumas das variáveis irrelevantes):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
Isso parece extremamente perigoso. A maioria dos scripts que escrevo depende de errexit
para interromper a execução se algum comando falhar. Acabei de localizar um bug em um dos meus scripts causado por isso, em que a função que deveria restaurar errexit
no final acabou cancelando, retornando ao padrão desligado para o duração do script.
O que eu gostaria de poder fazer é escrever funções que possam definir opções conforme necessário e depois restaurar todas as opções corretamente antes de sair. Mas parece que no subshell invocado pela substituição do comando, errexit
não é herdado.
Não sei como salvar o resultado de set +o
sem usar a substituição de comandos ou saltar através de aros FIFO. Eu posso ler a partir de $SHELLOPTS
, mas não é gravável ou no formato eval
-able.
Eu sei que uma alternativa é usar uma função subshell , mas isso introduz muitas dores de cabeça para ser capaz de logar saída, bem como passar várias variáveis.
Provavelmente relacionado: link (parece que há uma solução alternativa para o bash 4.4, mas eu prefiro ter uma solução portátil)