Variable d'environnement et script bash

Fermé
SkillEx - 25 juin 2013 à 11:58
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 - 25 juin 2013 à 16:23
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)

5 réponses

dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 juin 2013 à 12:47
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
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
Modifié par dubcek le 25/06/2013 à 14:03
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
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 juin 2013 à 16:23
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
25 juin 2013 à 14:35
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