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 d'environnement script


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut Variables d'environnement script
    Bonjour,

    Je souhaiterai créer dans un script une variable d'environnement.
    Prenons l'exemple suivant d'un script nommé "test":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IPE='172.16.2.98'
    export IPE=$IPE
    Puis si je fais echo $IPE, la résultat est vide.

    Par contre, si je lance le script de cette façon:
    La variable est bien exportée, mais si je redémarre la machine, je les perds.

    J'ai donc deux questions:
    1) Comment faire pour que ces variables soient permanentes ?
    2) Pour pouvoir exporter ces variables depuis un script, suis-je obligé de faire ou existe-il une autre méthode ?

    En espérant avoir été clair !

    Cordialement, Benjamin.

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

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

    pour rendre une variable disponible dans l'environnement courant depuis un script, il faut le sourcer, comme tu le fais.
    je ne me souviens pas d'autres façons de faire.

    pour qu'une variable soit exportée de manière pérenne, cela doit être fait dans ~/.bash_profile, ou ~/.bashrc (ça dépend comment démarre ta machine).
    cf . man bash

    Citation Envoyé par benji22fr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IPE='172.16.2.98'
    export IPE=$IPE
    attention, cette écriture n'est pas POSIX.
    Code POSIX : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IPE="172.16.2.98"
    export IPE
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    export IPE="172.16.2.98"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut
    Bonjour et merci pour la réponse.

    J'arrive à me dépatouiller en faisant cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IPE="172.16.2.98"
    export IPE=$IPE
    echo "export IPE=$IPE" >> ~/.bashrc
    Maintenant j'ai une autre question !
    Si je ne "refresh" pas mon bashrc, les variables ne sont pas prises en compte, donc je fais:
    ou
    Jusque là pas de problème, mais je souhaite effectuer ces manipulations dans un script bash, mais le problème est que quand je fais le "refresh", mon script s'arrête alors qu'il reste des commandes par la suite.

    Comment faire pour que cette commande soit prise en compte dans le script bash sans stopper son déroulement ?

    Cordialement, Benjamin

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    je souhaite effectuer ces manipulations dans un script bash, mais le problème est que quand je fais le "refresh", mon script s'arrête alors qu'il reste des commandes par la suite.
    si tu avais commencé par nous donner tes intentions, tu n'en serais pas là.

    les variables exportées dans ~/.bashrc sont accessibles pour de l'interpréteur courant, et les programmes qui y sont exécutés :
    par exemple, dans mon .bashrc, j'exporte la variable EDITOR=/usr/bin/vim, et dans un script testXport.exemple, j'ai mis echo $EDITOR; à l'exécution cela m'affiche bien /usr/bin/vim.
    il n'est pas nécessaire de sourcer à nouveau ~/.bashrc.

    donc, il faut détailler davantage ton projet.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut
    Je vais détailler tout alors

    J'ai créé un script qui me permet d'installer et configurer automatiquement un cluster MySQL avec deux serveurs (maitre et esclave) sous DRBD et Heartbeat avec la possibilité de créer à part des instances MySQL si besoin par la suite.
    Ce que je souhaite, c'est lors de la première installation (Cluster + mysql), créer des variables d'environnement de toutes les variables importantes du script, du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IPSERVESCLAVE=172.16.2.98
    echo "export IPSERVESCLAVE=$IPSERVESCLAVE" >> ~/.bashrc
    echo $IPSERVESCLAVE
    172.16.2.98
    Afin que par la suite, je puisse aller les récupérer lors de la création d'une nouvelle instance, du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IPSERVESCLAVE=$(echo $IPSERVESCLAVE)
    Ainsi, lors de la création d'une instance MySQL, toutes les variables pré-requises seront renseignées à l'aide des variables d'environnement.
    Jusqu'ici, tout va bien !

    Le soucis que j'ai, c'est que étant donné que c'est du clustering, il faut que toutes ces variables d'environnement soient répliquées sur le serveur esclave au cas où le serveur maitre serait dans les choux, afin de pouvoir continuer à travailler et créer des instances sur l'esclave.

    Mais je n'arrive pas à faire prendre en compte par la biais de ssh les variables d'environnement sur le serveur esclave.
    L'astuce que j'avais trouvé était de répliquer mon .bashrc du maitre vers l'esclave puis rafraîchir par la suite, mais comme expliqué plus tôt, si j'utilise les commandes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    source ~/.bashrc ou bash ou exec bash
    mon script s'arrête !

    Voilà, je crois avoir bien détaillé mon problème ^^
    J'espère avoir été clair

    Cordialement, Benjamin.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    pas besoin de sourcer ~/.bashrc, dans ton script; les variables qui sont exportées depuis ~/.bashrc devraient être accessibles depuis n'importe quelle commande/script.

    si les scripts, qui seront exécutés ultérieurement, le seront de manière non-interactive (sans ouvrir de pseudo-terminal/console), il peut être préférable d'utiliser un fichier annexe qui, lui, sera sourcé dans les-dits scripts.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut
    Quand tu dis "utiliser un fichier annexe qui, lui, sera sourcé dans les-dits scripts.", tu entends quoi par sourcé ? Qu'il va chercher des infos dedans, c'est ça ?
    Mais le problème avec un fichier annexe, c'est comment faire pour que le script le parcourt puis récupère la valeur qui l'intéresse à un instant T ?
    Imaginons que je veux la valeur de toto:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    titi=0
    tata=1
    toto=2
    Je précise que j'ai débuté le script il y a un mois donc je suis entrain de me faire la main

    Cordialement, Benjamin.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut
    Du coup, j'ai fait un peu comme tu as dit, si jamais ça peut intéresser quelqu'un:

    Nous avons deux fichiers, un nommé "variables" où sont renseignés le nom des variables de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IPSERVEURESCLAVE=RIPSERVEURESCLAVE
    IPSERVEURMAITRE=RIPSERVEURMAITRE
    ...
    où R$NOMVARIABLE permet, à l'aide de sed, de savoir qu'elle chaîne de caractère il doit modifier.

    Ensuite, dans le script nommé "script", renseigner une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IPSERVEURSCLAVE=172.16.2.98
    Puis effectuer un sed afin de modifier la chaîne de caractère dans "variables":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i s#RIPSERVEURSCLAVE#$IPSERVEURSCLAVE#g variables
    Si on regarde de nouveau le fichier "variables", on peut y voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IPSERVEURESCLAVE=172.16.2.98
    IPSERVEURMAITRE=RIPSERVEURMAITRE
    Imaginons maintenant que notre script utilise plusieurs fonctions où la variable est utilisée.
    Afin de ne pas devoir la renseigner à chaque fois, on peut utiliser awk pour récupérer la valeur de la variable dans le fichier "variables", ce qui permet aussi de modifier en un seul endroit la variable (plus simple), ce qui donnerait dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Récupération de la valeur de la variable:
    IPSERVEURSCLAVE=$(awk -F"IPSERVEURSCLAVE=" '{print $2}' variables)
    echo $IPSERVEURSCLAVE
    172.16.2.98
    Cependant, j'ai rencontré un problème avec des retours chariots et espaces qui s'inséraient dans la valeur de la variable lors de son utilisation par la suite.
    Afin de corriger ceci, j'ai utiliser ces expressions régulières pour les enlever:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IPSERVEURSCLAVE=$(awk -F"IPSERVEURSCLAVE=" '{print $2}' variables | tr '\n' ' ' | sed 's/^ *//g' | sed 's/ *$//g')
    J'espère que cela pourra aider quelqu'un et j'espère aussi avoir été clair
    Je clos donc le sujet.

    Cordialement, Benjamin.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    cela me paraît bien compliqué

    ce que j'ai compris :
    tu as
    un script d'installation, qui renseigne certaines variables (x,y,z)
    des scripts qui tourneront plus tard, et qui utiliseront les variables x, y, z.

    =>
    Code install.script : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    src=/chemin/vers/fichier.src
    read x y z
    printf '%s="%s"\n' x "$x" y "$y" z "$z" >"$src"
    Code suivants.script : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    src=/chemin/vers/fichier.src
    . "$src"
    printf '%s\n' "$x" "$y" "$z"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut
    Je ne prétends pas que je ne me complique pas la vie ^^
    Vu que j'apprends au jour le jour, je fais avec les moyens du bord

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2008, 11h33
  2. Script Batch : Variable d'environnement dans un fichier "ordinaire"
    Par falcon dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 06/05/2008, 15h54
  3. Script variable d'environnement système
    Par popinenhbourg dans le forum Windows
    Réponses: 8
    Dernier message: 19/07/2007, 17h51
  4. changer une variable d'environnement a partir d'un script
    Par doomxl dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 28/06/2007, 13h08
  5. Réponses: 1
    Dernier message: 11/01/2007, 15h57

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