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.
Vous devriez source votre script, avec
. ./script
ou
source ./script
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
.
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)