Variable d'environnement et script bash

SkillEx -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  2. SkillEx
     
    Merci pour la réponse.

    C'est embêtant.
    Comment faire pour que la fonction puisse retourner une valeur du coup ?
    0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  4. 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
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      retour=$(maFonction arg1 arg2)
      pour que ceci fonctionne, il faut dans la fonction : echo $phrase
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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