Eu li muitas perguntas em vários sites de troca de pilhas e fóruns de ajuda do unix sobre como modificar opções de shell e depois restaurá-las - a mais abrangente que encontrei aqui é em Como "desfazer" um `set -x`?
A sabedoria recebida parece ser a de salvar tanto fora o resultado de set +oou shopt -poe, em seguida, evalele mais tarde para restaurar as configurações anteriores.
No entanto, em meus próprios testes com o bash 3.xe 4.x, a errexitopção não é salva corretamente ao fazer a substituição de comandos.
Aqui está um exemplo de script 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 (cortei 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 errexitpara interromper a execução se algum comando falhar. Eu apenas localizei um bug em um dos meus scripts causado por isso, onde a função que deveria restaurar errexitno final acabou substituindo-a, retornando-a ao padrão de off durante a duração do script.
O que eu gostaria de poder fazer é escrever funções que podem definir opções conforme necessário e depois restaurar todas as opções corretamente antes de sair. Mas parece que no sub-invocador invocado pela substituição de comando, errexitnão é herdado.
Estou sem saber como salvar o resultado set +osem usar a substituição de comandos ou pular os aros FIFO. Eu posso ler, $SHELLOPTSmas não é evalum formato gravável ou inativável.
Eu sei que uma alternativa é usar uma função subshell , mas isso introduz muitas dores de cabeça por poder registrar a saída e também transmitir várias variáveis.
Provavelmente relacionado: /programming/29532904/bash-subshell-errexit-semantics (parece que existe uma solução alternativa para o bash 4.4 e superior, mas eu prefiro ter uma solução portátil)
shoptopções de conjunto do bash (como nullglob).