Execution d'un script shell a partir d'un fichier

Execution d'un script shell a partir d'un fichier - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 06-12-2004 à 16:39:45    

Je tourne sous suse9.1 avec le shell 'bash'.
Il y a kkchose qui me turlupine :
 
Dans un fichier 'script.sh' je mets :


export JAVA_HOME="un_chemin_qcq"


 
lorsque dans le shell bash je tape la commande pour executer ce script :


> ./script.sh


 
...et que je fais  


> echo $JAVA_HOME


 
la variable n'a aucune valeur, elle vaut "chaine vide" ! Par contre si je fais la commande


> source ./script.sh


 
...JAVA_HOME est tres bien defini !
 
au fait :
1) mon fichier est bien executable
2) je suis dans le bon chemin pour executer la commande
 
Question :
1) comment marche le bash ? (j'ai essaié avec ksh, sh, xterm,...c le meme probleme !
2) que fait de plus la commande 'source' ?
 
Merci  :jap:

Reply

Marsh Posté le 06-12-2004 à 16:39:45   

Reply

Marsh Posté le 06-12-2004 à 17:21:10    

Quand tu fait ./script.sh, en fait un nouveau process bash est lancé, la variable JAVA_HOME est défini dans l'environnement d'execution de celui-ci.  
Quand tu termines ton scripts et reviens dans ton bash initial, l'environnement d'execution du bash dedié a ton script n'existe plus, ainsi que ta variable ;)
 
La commande source fait (cf. man bash) :

Citation :

Lire  et  exécuter  les  commandes contenues dans le fichier  
avec l'environnement du shell en  cours,  puis  renvoyer  le
code  de  retour  de  la  dernière commande exécutée dans le
fichier.


 
Voila ;)

Reply

Marsh Posté le 06-12-2004 à 17:22:06    

1) Un processus ne peut pas modifier l'environnement de son parent. Il ne peut modifier que son propre environnement. Il peut aussi choisir quel environnement transmettre lors d'un exec. Quand tu executes ton script avec ./script.sh, ton shell fork et lance un nouveau shell qui va executer ton script. JAVA est modifie dans l'environnement du processus fils, pas dans le processus pere (ton shell).
 
2) "source" demande au shell courant d'interpreter le script qui est passe en argument. Ca ne cree pas de sous-shell. Donc dans ce cas ton script modifie bien l'environnement de ton shell courant.
 
Note que "." est equivalent a "source". Au lieu de faire "source ./script.sh", tu peux faire ". ./script.sh".

Reply

Marsh Posté le 06-12-2004 à 17:59:37    

Putain, parfait les mecs !  :jap: voilà qui est clair  :love:
 
EDIT : je voudrais que ce script s'execute a chaque demarrage de session et pour tout les environnements donc ! ou dois-je faire ca ?


Message édité par Giz le 06-12-2004 à 18:01:06
Reply

Marsh Posté le 06-12-2004 à 18:03:21    

dans /etc/profile ;)

Reply

Marsh Posté le 06-12-2004 à 18:03:52    

matafan a écrit :

1) Un processus ne peut pas modifier l'environnement de son parent. Il ne peut modifier que son propre environnement. Il peut aussi choisir quel environnement transmettre lors d'un exec. Quand tu executes ton script avec ./script.sh, ton shell fork et lance un nouveau shell qui va executer ton script. JAVA est modifie dans l'environnement du processus fils, pas dans le processus pere (ton shell).
 
2) "source" demande au shell courant d'interpreter le script qui est passe en argument. Ca ne cree pas de sous-shell. Donc dans ce cas ton script modifie bien l'environnement de ton shell courant.
 
Note que "." est equivalent a "source". Au lieu de faire "source ./script.sh", tu peux faire ". ./script.sh".


 
les '../' ne ramène pas au repertoire parent  :heink:

Reply

Marsh Posté le 06-12-2004 à 18:04:26    

. 'espace' ./script.sh :D

Reply

Marsh Posté le 06-12-2004 à 18:06:03    

e_esprit a écrit :

dans /etc/profile ;)


 
Et dans mon home (je veux ceci juste pour mon compte) il n'y a pas un "meme" fichier ? (j'ai essaié de mettre `path_du_script` dans le ~/.bashrc mais ca initialise toujours pas mes variables)

Reply

Marsh Posté le 06-12-2004 à 18:08:15    

.profile ou .bashrc (EDIT: ou encore .bash_profile, le fichier utilisé depends du statut du shell (shell de login ou non, interactif ou non...), je te laisse chercher celui qui t'interesse :d)
 
et dans ce fichier la, pas besoin du 'source'
les 'export TES_VARIABLE=TrucHocse' doivent fonctionner sans problèmes ;)
 
Mais ca peut etre une bonne idée de faire un source afin de séparer tes fichiers :)


Message édité par e_esprit le 06-12-2004 à 18:11:11
Reply

Marsh Posté le 06-12-2004 à 18:11:12    

e_esprit a écrit :

.profile ou .bashrc
 
et dans ce fichier la, pas besoin du 'source'
les 'export TES_VARIABLE=TrucHocse' doivent fonctionner sans problèmes ;)
 
Mais ca peut etre une bonne idée de faire un source afin de séparer tes fichiers :)


 
OK v revoir ca. Merci pour "l'aide personnelle instantanée" :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed