2010-06-19 19 views
0

j'ai un script bash comme suit:shell Bash perdre des variables d'environnement entre les deux lignes

rvm use 1.8.7 
rvm list 

La première ligne est une fonction chargée dans mon .bashrc qui définit certaines variables d'environnement. Lors de l'exécution de la deuxième ligne, ces variables ont été définies sur leurs valeurs précédentes (les valeurs définies ont été perdues). Qu'est-ce que j'oublie ici?

En cours d'exécution sur une boîte ubuntu.

+4

Pouvez-vous nous en dire plus sur 'rvm'? Son comportement est critique ici. –

Répondre

2

Une sous-cellule est en cours de création et les variables y sont définies. Lorsque le sous-shell se termine, les modifications sont perdues. Cela arrive souvent lorsqu'une boucle while se trouve dans un tuyau. Sans voir la fonction, il est impossible d'être plus précis que cela.

+0

Bonjour Dennis, C'est la source de la fonction. Toute suggestion? http://gist.github.com/449879 –

+0

Ce n'est pas une fonction, c'est un script et il n'y a pas non plus de fonctions définies dedans. Cependant, il définit certaines variables d'environnement. Si vous 'source' ce fichier, il va les définir dans l'environnement actuel. Si vous l'exécutez à la place, cependant, ils ne persisteront pas dans l'environnement actuel. À moins que les variables ne soient exportées dans ce fichier quand elles proviennent de la fin: 'source $ rvm_scripts_path/rvm', elles ne seront pas disponibles pour ce script/fonction quand il est exécuté juste à la fin:' rvm $ * '. Veuillez montrer la fonction qui est définie quelque part comme ceci: 'rvm() {...}' ou 'function rvm ...'. –

+0

Bonjour Dennis, Désolé, c'était mon erreur alors. Je pensais que c'était une fonction parce que je l'ai lu ailleurs. Le code avoe se trouve dans le fichier rvm qui provient de bash_profile lorsque l'utilisateur se connecte. Après la connexion, nous exécutons le serveur CI comme "nohup java -war hudson.war" et ce processus appelle un "build.sh "fichier: utilisation rvm 1.8.7 liste rvm Et c'est quand la deuxième ligne n'a pas accès aux valeurs définies par le premier. –

0

lorsque vous définissez les variables d'environnement que vous souhaitez mettre à la disposition à tous les sous-couches, vous devez préfixer avec l'exportation comme ceci:

export myvar = « une valeur »

Je vérifierais que RVM fait cela correctement

+0

Toutefois, les modifications apportées aux sous-cases ne seront pas conservées par le parent. Essayez ceci dans Bash: 'a = 11; écho salut | en lisant b; fais écho "startloop [$ a] [$ b]"; a = 22; echo "inside [$ a] [$ b]"; terminé; echo "outside [$ a] [$ b]" '. Le tube dans 'while' crée un sous-shell. Maintenant, essayez avec 'export':' export a = 11; echo hi | pendant la lecture b; fais écho "startloop [$ a] [$ b]"; a = 22; echo "inside [$ a] [$ b]"; terminé; echo "outside [$ a] [$ b]" ' –

+0

Vous pouvez éviter le sous-shell comme ceci:' while ... done <<(echo hi) 'ou' while ... done <<< hi' –

+0

yes this est vrai, vous ne voulez jamais que les variables de shell polluent potentiellement le shell parent.cependant, si vous générez le script rvm, toutes les variables d'environnement définies dans rvm seront disponibles dans le shell parent – ennuikiller