Jai plusieurs comptes Amazon EC2 et je souhaite pouvoir rapidement changer de variable, comme $EC2_HOME
, en utilisant un script.
Jai un script shell configuré comme ceci:
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
Quand jexécute le script, je sais que EC2_HOME
est défini, mais je pensais que lutilisation de export
ferait rester la variable une fois le script terminé. Ce nest pas le cas, car exécuter 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. I jai essayé de chercher des questions connexes sans chance – alors mes excuses sil sagit dun doublon.
Réponse
Vous devriez trouver votre script, avec
. ./script
ou
source ./script
Commentaires
- la raison en est que votre script génère un nouveau processus shell en tant quenfant du shell actuel. Les modifications denvironnement que vous apportez au processus enfant ne peuvent affecter le parent. Lorsque vous utilisez
.
ousource
, vous ne créez pas de nouveau processus enfant, vous exécutez les commandes dans le shell actuel. - @glennjackman Jai un problème similaire et jai essayé votre solution mais cela me déconnecte du shell quand je fais
.
ousource
. Pourquoi est-ce que cest arrivé pening? - @Patryk: peut-être que votre script a une instruction
exit
, donc il ne convient pas pour une source. - Alors que
source ./script
fonctionne parfaitement,sudo source ./script.sh
ditsudo: source: command not found
. Comment puis-je faire cela en utilisant sudo? - @ 71GA: en fonction des préférences de compilation pour
sudo
et en fonction des paramètres de configuration dans/etc/sudoers
vous pouvez ou ne pouvez pas préserver votre environnement lors de lexécution de commandes avecsudo
. Je vous suggère dessayer de trouver votre script, puis dexécutersudo
avec loption-E
pour préserver lenvironnement. Si cela ne fonctionne pas, je suppose que vous ne pouvez pas faire grand-chose.
Réponse
Lorsque vous exécutez un script il obtient son propre shell et son propre environnement, qui disparaissent à nouveau dès que le script est terminé. Pour conserver les variables denvironnement, source le script dans votre shell actuel:
$ source ./a.sh
ou de manière équivalente (mais un peu plus portable) utilisez le Commande POSIX dot :
$ . ./a.sh
Ensuite, les définitions seront placées dans lenvironnement de votre shell actuel et héritées par tous les programmes que vous lancez à partir de celui-ci.
Pour être plus proche de lexécution dun script, . a.sh
trouvera a.sh en recherchant les répertoires dans PATH
Variable denvironnement.
Il y a quelques subtilités dans leur comportement, et si .
et source
sont identiques (ou présents 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
, peuvent varier . Pour Bash source
et .
sont identiques 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é sous forme de chemin (contenant un /
), ce chemin est utilisé directement dans tous les cas. La chose la plus fiable à faire est . ./script
ou . /path/to/script
.
Réponse
Juste pour enregistrement.
Si vous voulez exécuter un script depuis 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)
Commentaires
- Cela a lair dangereux mais utile si vous faites confiance à ce script!
Réponse
Essayez
exec ./script
La commande exec exécute le script dans le shell actuel sans démarrer le shell non interactif.