Je veux utiliser un script Shell que je peux appeler pour définir certaines variables d'environnement. Cependant, après l'exécution du script, je ne vois pas la variable d'environnement utilisant "printenv" dans bash.
Voici mon script:
#!/bin/bash
echo "Hello!"
export MYVAR=boubou
echo "After setting MYVAR!"
Quand je fais "./test.sh", je vois:
Hello!
After setting MYVAR!
Quand je fais "printenv MYVAR", je ne vois rien.
Pouvez-vous me dire ce que je fais mal?
Voici comment fonctionnent les variables d'environnement. Chaque processus a une copie de l'environnement. Toutes les modifications apportées par le processus à sa copie se propagent aux enfants du processus. Cependant, ils ne se propagent pas au parent du processus.
Pour contourner ce problème, utilisez la commande source
:
source ./test.sh
ou
. ./test.sh
(les deux formes sont synonymes).
Lorsque vous faites cela, au lieu d'exécuter le script dans un sous-shell, bash
exécutera chaque commande du script comme si elle avait été tapée à l'invite.
Une autre alternative serait d'avoir le script print les variables que vous voulez définir, avec echo export VAR=value
Et faire eval "$(./test.sh)"
dans votre shell principal. C'est l'approche utilisée par divers programmes [par ex. redimensionner, dircolors] qui fournissent des variables d'environnement à définir.
Cela ne fonctionne que si le script n'a pas d'autre sortie (ou si une autre sortie apparaît sur stderr, avec >&2
)