web-dev-qa-db-fra.com

La définition de la variable d'environnement dans le script Shell ne la rend pas visible pour le shell

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?

29
GDICommander

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.

52
NPE

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)

3
Random832