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 . ou source, 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 . ou source. 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 dit sudo: 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 avec sudo. Je vous suggère dessayer de trouver votre script, puis dexécuter sudo 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *