web-dev-qa-db-fra.com

Comment puis-je conserver les variables d'environnement "exportées" dans un script Shell?

J'ai plusieurs comptes Amazon EC2 et je souhaite pouvoir rapidement changer de variable, comme $EC2_HOME, à l'aide d'un script.

J'ai un script Shell configuré comme ceci:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Lorsque j'exécute le script, je sais que EC2_HOME est défini, mais je pensais qu'en utilisant export, la variable resterait une fois le script terminé. Ce n'est pas le cas, car en exécutant echo $EC_HOME ne montre rien.

Je sais que cela doit être une connaissance très rudimentaire des scripts Linux, mais je ne le sais pas. J'ai essayé de chercher des questions connexes sans chance - donc mes excuses s'il s'agit d'un doublon.

65
cwd

Vous devriez source votre script, avec

. ./script

ou

source ./script
70
enzotib

Lorsque vous exécutez un script, il obtient son propre shell et son propre environnement, qui disparaissent à nouveau une fois le script terminé. Pour conserver les variables d'environnement, sourcez le script dans votre shell actuel:

$ source ./a.sh

ou de manière équivalente (mais un peu plus portable) utilisez la commande POSIX dot :

$ . ./a.sh

Ensuite, les définitions seront placées dans l'environnement de votre shell actuel et héritées par tous les programmes que vous lancerez à partir de celui-ci.

Pour être plus proche de l'exécution d'un script, . a.sh trouvera a.sh en recherchant les répertoires dans la variable d'environnement PATH.


Il y a quelques subtilités dans leur comportement et si . et source sont les mêmes (ou pas du tout). . ./a.sh se comportera certainement de la même manière dans tous les Shell compatibles POSIX, mais source et ., et . a.sh et . ./a.sh, peut varier. Pour Bash source et . sont les mêmes dans tous les cas; pour zsh source vérifie toujours le répertoire courant en premier ; ksh est essentiellement similaire.

Si le nom du script est donné comme chemin (contenant un /), ce chemin est utilisé directement dans tous les cas. La chose la plus fiable à porter est . ./script ou . /path/to/script.

38
Michael Homer

Juste pour mémoire.

Si vous voulez exécuter un script à partir d'Internet qui exporte env vers le système

vous pouvez utiliser le format suivant

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Par exemple:

source <(curl -s -L https://example.com/install.sh)
1
toffee