Variable d'environnement et script bash

SkillEx -  
dubcek Messages postés 19021 Statut Contributeur -
Bonjour,

J'ai un problème avec un scripte en bash et les variables d'environnements de façons plus générale.

Dans le script, il y a une fonction qui doit retourner une chaine comme résultat.
Parait qu'il faut utiliser les variables d'environnement car on ne peut pas retourner n'importe quoi avec les fonctions, en bash.

Seulement le pauvre mortel que je suis ne s'en sort pas !
J'ai ajouté dans /root/.bashrc
export phrase=''
il y a bien "phrase" comme variable d'environnement.
elle est visible quant je fais #env

Ensuite dans la fonction du script le code est le suivant (dans $uneAutreVariable il y a bien une chaine de caractère)
export phrase=$uneAutreVariable

mais après la fonction, la variable d'environnement phrase est vide à nouveau, et elle l'est aussi lorsque je la visionne avec env.

Qui est-ce qui pourrait m'expliquer ce que j'ai probablement du louper ? (ce n'est pourtant pas faute d'avoir chercher et essayer)
A voir également:

5 réponses

dubcek Messages postés 19021 Statut Contributeur 5 637
 
hello
l'export ne va que dans un sens, du processus père aux processus enfants. Une fois modifiée, la variable disparait quand la tâche termine.
donc si cmd2 est exécuté depuis cmd1, les variables exportées par cmd1 seront visibles dans cmd2, mais si elles sont modifiées, cmd1 ne les verra pas.
0
SkillEx
 
Merci pour la réponse.

C'est embêtant.
Comment faire pour que la fonction puisse retourner une valeur du coup ?
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
une fonction ne créée pas un shell donc si la fonction est dans le script, ça fonctionne
$ export x=1
$ ddate () { date ; export x=2 ; }
$ echo $x
1
$ ddate
Tue Jun 25 13:43:41 CEST 2013
$ echo $x
2
$ 
l'export est inutile puisqu'on reste dans la même tâche
0
SkillEx
 
En effet l'exemple marche.
Dans mon script ça marche aussi à présent.

Merci beaucoup, ça fesait un paquet de temps que ces variables globale me faisait la vie dure .

Question subsidiaire : ça ne marchait pas, par contre, lorsque la fonction était appelée de cette façon
retour=$(maFonction arg1 arg2)
alors que la valeur était modifiée avec un export phrase="blabla" dans maFonction.
Mais ça marche directe en modifiant pour
maFonction arg1 arg2

Est-ce que tu sais pourquoi ?
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
retour=$(maFonction arg1 arg2)
pour que ceci fonctionne, il faut dans la fonction : echo $phrase
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 19021 Statut Contributeur 5 637
 
en exécutant avec $(..) le shell crée une autre tâche et donc son environnement est perdu
$ x=1
$ ddate () { date ; x=2 ; }
$ d=$(ddate)
$ echo $d
Tue Jun 25 14:30:39 CEST 2013
$ echo $x
1
$ ddate
Tue Jun 25 14:34:25 CEST 2013
$ echo $x
2
$ 
0