J'écris un script qui doit être exécuté en utilisant source
, car sa tâche est de modifier l'environnement. Pendant le script, je veux l'utiliser set -e
pour que toute erreur arrête le script. Le script ressemble à ceci:
#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript
Le problème est que, set -e
naturellement, reste en vigueur après la fin du script. Comment puis-je m'assurer que l' set
option modifiée est correctement restaurée à sa valeur précédente lorsque le script s'arrête (de quelque manière que ce soit - en réussissant ou en cas d'erreur)?
bash
script
bash-scripting
Petr Pudlák
la source
la source
-x
/xtrace
) est résolu à Supprimer la trace d'exécution pour la commande echo?Réponses:
Exactement de la même manière que vous l'activez: appeler le buitin
set
:Depuis la
bash(1)
page de manuel, sous laSHELL BUILTIN COMMANDS
section, commande `set ':la source
set -o
pour connaître votre configuration actuelle. Soyez explicite lorsque vous définissez / supprimez l'un d'eux sur vos scripts.La commande
set +o
répertorie les paramètres actuels comme des commandes qui restaurent le même état, par exempleVous pouvez facilement restaurer toutes les options plus tard, si vous enregistrez cette sortie dans une variable shell:
Bash comprend également un certain nombre d'options non standard (pas POSIX) qui sont ajustées à l'aide de la
shopt
commande. La commandeshopt -p
peut être utilisée pour enregistrer ces options d'une manière similaire.Si vous ne souhaitez enregistrer et restaurer qu'une seule option, vous pouvez utiliser la variable d'environnement $ -, qui répertorie l'ensemble d'options actuel sous forme de lettres, par exemple
Vous pouvez utiliser quelque chose comme ceci pour enregistrer et restaurer une option particulière:
la source
Utilisez un piège RETOUR
RETURN
les pièges fonctionnent également pour les scripts d'origine.main_script.sh
a_script_to_be_sourced.sh
Tester
la source
La restauration des paramètres activés précédents peut être effectuée rapidement comme suit:
Dans l'autre sens (restauration à l'état désactivé) AFAIK, il n'y a pas un tel raccourci et la réponse de Seppo couvre tous les cas.
la source
-bash: set: -i: invalid option
parce que le-i
drapeau note un shell interactif.