J'ai lu de nombreuses questions sur divers sites d'échange de piles et forums d'aide Unix sur la façon de modifier les options du shell, puis de les restaurer - la plus complète que j'ai trouvée ici est Comment "annuler" un `set -x`?
La sagesse reçue semble être de sauvegarder le résultat de set +oou shopt -popuis evalde restaurer les paramètres précédents.
Cependant, dans mes propres tests avec bash 3.x et 4.x, l' errexitoption n'est pas enregistrée correctement lors de la substitution de commande.
Voici un exemple de script pour montrer le problème:
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
Et la sortie (j'ai supprimé certaines des variables non pertinentes):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
Cela semble extrêmement dangereux. La plupart des scripts que j'écris dépendent errexitd'arrêter l'exécution si des commandes échouent. Je viens de localiser un bug dans l'un de mes scripts causé par cela, où la fonction qui était censée être restaurée errexità la fin a été remplacée, la redéfinissant par défaut sur off pendant la durée du script.
Ce que j'aimerais pouvoir faire, c'est écrire des fonctions qui peuvent définir des options selon les besoins, puis restaurer correctement toutes les options avant de quitter. Mais il semble que dans le sous-shell invoqué par la substitution de commande, il errexitne soit pas hérité.
Je ne sais pas comment économiser le résultat set +osans utiliser de substitution de commande ou sauter à travers des cercles FIFO. Je peux lire, $SHELLOPTSmais ce n'est pas accessible en écriture ou au evalformat.
Je sais qu'une alternative est d'utiliser une fonction de sous - shell , mais cela introduit beaucoup de maux de tête pour pouvoir enregistrer la sortie ainsi que transmettre plusieurs variables.
Probablement lié: /programming/29532904/bash-subshell-errexit-semantics (il semble qu'il existe une solution de contournement pour bash 4.4 et plus, mais je préfère avoir une solution portable)
shoptoptions de l'ensemble bash (comme nullglob).