IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Variables et sous-scripts


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Par défaut Variables et sous-scripts
    Bonjour,

    J'utilise un script qui appelle un deuxième script qui initialise des variables que je veux utiliser dans mon premier script :
    • Soit une variable récupérée via un echo
    • Soit plusieurs variables récupérées par un export


    Jusqu'à présent c'était soit l'un ou l'autre donc ça ne pose pas de problème :
    • on utilise VAR=$(./script2.sh) pour récupérée la donnée envoyée par echo
    • On utilise les variables initialisées par l'appel du script avec le point pour ne pas créer un autre shel : . ./script2.sh


    Désormais j'aimerais utiliser les deux en même temps sans modifier le deuxième script. Logiquement, il me suffit d'utiliser VAR=$(. ./script2.sh) mais les variables initialisées par les export sont vides dans le premier script.

    Voici un exemple, le quatrième cas ne fonctionne pas comme prévu. Y a-t-il une solution sans modifier le deuxième script (sous-shell.sh) ?

    test.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/bin/bash
    # Database INFO
     
    VAR_EXPORT=
    VAR_ECHO=
    echo Appel 1
     
    ./sous-shell.sh
     
    echo VAR_EXPORT=$VAR_EXPORT
    echo VAR_ECHO=$VAR_ECHO
     
    VAR_EXPORT=
    VAR_ECHO=
    echo Appel 2
     
    . ./sous-shell.sh
     
    echo VAR_EXPORT=$VAR_EXPORT
    echo VAR_ECHO=$VAR_ECHO
     
    VAR_EXPORT=
    VAR_ECHO=
    echo Appel 3
     
    VAR_ECHO=$(./sous-shell.sh)
     
    echo VAR_EXPORT=$VAR_EXPORT
    echo VAR_ECHO=$VAR_ECHO
     
    VAR_EXPORT=
    VAR_ECHO=
    echo Appel 4
     
    VAR_ECHO=$(. ./sous-shell.sh)
     
    echo VAR_EXPORT=$VAR_EXPORT
    echo VAR_ECHO=$VAR_ECHO
    sous-shell.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    # Database INFO
    export VAR_EXPORT=VAR_EXPORT
    echo VAR_ECHO
    Résultat :

    Appel 1
    VAR_ECHO
    VAR_EXPORT=
    VAR_ECHO=
    Appel 2
    VAR_ECHO
    VAR_EXPORT=VAR_EXPORT
    VAR_ECHO=
    Appel 3
    VAR_EXPORT=
    VAR_ECHO=VAR_ECHO
    Appel 4
    VAR_EXPORT=
    VAR_ECHO=VAR_ECHO

    Commentaire :
    Appel 1 : OK, export ne sont pas utilisables vu qu'on a ouvert un sous shell
    Appel 2 : OK, export utilisables vu qu'on reste dans le même shell
    Appel 3 : OK, on stocke la donnée renvoyée par echo dans la variable et l'export ne fonctionne pas car on a ouvert un sous-shell
    Appel 4 : KO, on stocke la donnée renvoyée par echo dans la variable mais l'export ne fonctionne pas comme souhaité

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    Bonjour,

    la substitution de commandes ($( )) produit aussi un sous-shell.
    les processus enfants ne peuvent pas exporter leurs variables vers leur parent.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Par défaut
    OK merci pour la réponse claire et rapide

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par animageo Voir le message
    sous-shell.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    # Database INFO
    export VAR_EXPORT=VAR_EXPORT
    echo VAR_ECHO
    Je plussoie bien évidemment la réponse de N_BaH.

    Petites précisions:
    Dans ce contexte, le 'export' ci-dessus ne sert à rien.
    Certains croient à tort qu'on peut "remonter" la valeur d'une variable dans le script appelant en utilisant 'export'. Il n'en est rien.

    Le 'export' d'une variable dans un script donné permet de transmettre la valorisation de cette variable dans les scripts appelés par ce script et non au script appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat caller_1.txt
    A=1; B=2; export A
    ./called.txt
    echo "caller_1 A:$A B:$B"
     
    $ cat called.txt
    echo "called A:$A B:$B"
    export A # inutile
    A=3 # sans effet sur l'appelant
     
    $ ./caller_1.txt
    called A:1 B:
    caller_1 A:1 B:2
    Toutefois, les sous-scripts (initiés par `` ou $(...) ou les pipes) reçoivent la valorisation des variables exportées et non exportées (sans pouvoir les modifier).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat caller_2.txt
    A=1; B=2; export A
    C=$(echo "avant A:$A B:$B"; A=3; B=4; echo "apres A:$A B:$B")
    echo "caller C:$C"
    echo "caller_2 A:$A B:$B"
     
    $ ./caller_2.txt
    caller C:avant A:1 B:2
    apres A:3 B:4
    caller_2 A:1 B:2
    Comme on peut le constater, les scripts appelés (et non sourcés) et les sous-scripts ne peuvent jamais modifier la valeur de variables (qu'elles soient exportées ou non) de manière visible par l'appelant, ce qui est parois contre-intuitif (voir la valeur finale de A!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ cat caller_3.txt
    #!/bin/ksh
    A=0
    echo "a\nb\nc\nd" | while read lettre ; do
        ((A += 1))
        echo "${A}eme lettre:$lettre"
    done
    echo "caller_3 A:$A"
     
    $ ./caller_3.txt
    1eme lettre:a
    2eme lettre:b
    3eme lettre:c
    4eme lettre:d
    caller_3 A:0
    La valeur initiale de la variable A est récupérée par la boucle 'while'. La variable est incrémentée tout au long de la boucle. En sortie de la boucle, la variable A "récupère" sa valeur initiale (ce qui est gênant si on veut récupérer le nombre d'itérations ou positionner n'importe quelle variable globale, par exemple).

    Si un script est sourcé par un script donné, c'est quasiment comme si le texte du script sourcé était inclus dans le script qui le source. Il peut donc lire et modifier les variables du script sourçant. Il peut même exporter une variable et transmettre ce statut 'exporté' au script sourçant.

    Je crois (sans en être parfaitement sûr ) que tout ce que j'ai dit s'applique à tous les shells...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lecture d'une variable dans un sous-script
    Par jaljal dans le forum Linux
    Réponses: 1
    Dernier message: 18/04/2012, 19h27
  2. Variables, Export et sous-scripts
    Par NickVanHowen dans le forum Linux
    Réponses: 3
    Dernier message: 15/09/2008, 13h42
  3. Exporter une variable via un script sous KSH
    Par Snivel dans le forum Linux
    Réponses: 4
    Dernier message: 09/12/2005, 16h44
  4. Gestion de Variables dans un script
    Par John Lee dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/03/2005, 14h17
  5. [langage] Variable %ENV inter script
    Par MSP dans le forum Langage
    Réponses: 6
    Dernier message: 04/08/2003, 10h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo