Ho letto molte domande su vari siti di scambio di stack e unix help forum su come modificare le opzioni della shell e poi ripristinarle - quella più completa che ho trovato qui è su Come "annullare" un `set -x`?
La saggezza ricevuta sembra essere quella di salvare il risultato di set +oo shopt -poe evalsuccessivamente ripristinare le impostazioni precedenti.
Tuttavia, nei miei test con bash 3.xe 4.x, l' errexitopzione non viene salvata correttamente quando si esegue la sostituzione dei comandi.
Ecco uno script di esempio per mostrare il problema:
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
E output (ho eliminato alcune delle variabili irrilevanti):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
Questo sembra estremamente pericoloso. La maggior parte degli script che scrivo dipendono dall'interruzione errexitdell'esecuzione se i comandi falliscono. Ho appena individuato un bug in uno dei miei script causato da questo, in cui la funzione che avrebbe dovuto ripristinare errexitalla fine si è conclusa sovrascrivendolo, riportandolo al valore predefinito di off per la durata dello script.
Quello che mi piacerebbe poter fare è scrivere funzioni che possono impostare le opzioni secondo necessità e quindi ripristinare tutte le opzioni correttamente prima di uscire. Ma sembra che nella subshell invocata dalla sostituzione del comando, errexitnon sia ereditata.
Sono in perdita per come salvare il risultato set +osenza usare la sostituzione dei comandi o saltare attraverso i cerchi FIFO. Sono in grado di leggere $SHELLOPTSma non è evalun formato scrivibile o non in grado.
So che un'alternativa è usare una funzione subshell , ma ciò introduce molti mal di testa per poter registrare l'output e restituire più variabili.
Probabilmente correlato: /programming/29532904/bash-subshell-errexit-semantics (sembra che ci sia una soluzione alternativa per bash 4.4 e versioni successive ma preferirei avere una soluzione portatile)
shoptopzioni del set di bash (come nullglob).