web-dev-qa-db-fra.com

Un script peut-il modifier une variable d'environnement de son shell appelant?

Je mets mon Java_HOME dans mon fichier ~/.bashrc.

Maintenant, je dois créer un script qui modifiera le Java_HOME uniquement pour le terminal actuel, afin de pouvoir démarrer une application nécessitant Java 5.

J'ai créé ce script pour cette tâche, mais une fois terminé, je peux voir que Java_HOME n'est pas mis à jour.

export Java_HOME=/usr/lib/jvm/Java-5-Oracle/
export PATH=$PATH:$Java_HOME    

Voici le résultat

$ ./javaHome5.sh
$ echo $Java_HOME
/usr/lib/jvm/Java-6-Oracle/

Je pense que la raison pour laquelle cela n'est pas appliqué, c'est qu'un script est exécuté dans son propre terminal. Ainsi, lorsque le script se termine, le terminal actuel ne sera pas affecté.

Actuellement, le seul moyen que j'ai trouvé pour résoudre ce problème est:

  1. Editer mon ~/.bashrc et changer le Java_HOME var
  2. Exécutez source ~/.bashrc pour appliquer les modifications au terminal actuel. Ce qui encore ne peut pas être appliqué dans un script, car la commande source doit être exécutée dans la fenêtre en cours.

Il va sans dire que cette modification s’applique à toutes les nouvelles fenêtres de terminal. J’ai donc pratiquement besoin de le faire deux fois: un avant de lancer mon application et une fois de plus, juste pour restaurer les vars d’environnement à leur valeur par défaut. Ce n'est pas vraiment pratique.

Avez-vous des idées sur la façon de changer cette variable en utilisant un script?

2
yannicuLar

Ce n'est pas possible. Comme vous l'avez correctement observé, votre script s'exécute dans son propre shell. Ce shell obtient une copie de l'environnement de son shell parent lorsqu'il est créé et ne dispose d'aucun moyen d'accéder à l'environnement de ce dernier. Et c’est bien, car sinon les scripts pourraient avoir toutes sortes d’effets secondaires imprévus. ;)

Afin de modifier les variables dans votre Shell actuel, vous pouvez toujours créer votre fichier de script (au lieu de l'exécuter en tant que processus indépendant), afin que le script soit exécuté par votre Shell actuel au lieu d'un fichier créé. Si votre script s'appelle myscript.sh, appelez-le ainsi: source myscript.sh au lieu de ./myscript.sh.

6
Malte Skoruppa