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 :

Portée des variables d'environnement dans bashrc et bash_profile


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 892
    Billets dans le blog
    1
    Par défaut Portée des variables d'environnement dans bashrc et bash_profile
    Bonjour,

    j'ai quelques difficultés à bien cerner la portée des variables d'environnement crées dans ~/.bashrc et ~/.bash_profile

    Si j'inscris
    dans ces fichiers, cette variable est bien lisible par
    ou bien par
    dans n'importe quelle console qui sera ouverte.

    Mais cette variable est vide si je l'appelle dans un script :
    test.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    echo "$variable"
    Là l'exécution de test.sh ne me renvoie aucune valeur.

    Qui peut me fournir une explication ?
    Comment est-il possible de définir une variable d'environnement lisible dans tous les cas au niveau de la session ?
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    Par défaut
    Bonjour

    Ce que tu cherches ne serait-il pas le fait qu'un enfant ignore tout de son parent ? Il faut exporter la variable pour qu'elle soit accessible dans un sous-shell.

    ou (si elle a déjà été définie)

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    En complément de la réponse de FLodelarab, un bash non interactif (qui execute juste un script shell) ne charge pas de fichier de config, il hérite juste de l'environnement parent.

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 260
    Par défaut
    Pour utiliser un fichier de conf avec un bash non interactif, on peut pas utiliser la variable d'environnement BASH_ENV ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 892
    Billets dans le blog
    1
    Par défaut
    A partir de vos indications et d'autres recherches sur le Net, j'ai fait une petite synthèse qui pourra servir à d'autres.

    Les fichiers gérant les variables d'environnement au niveau de la session :
    .bashrc
    .bash_profile
    .profile

    Pour visualiser les variables d'environnement:
    Pour examiner une valeur particulière :
    Distinguer shell interactifs et shell non-interactifs. Un script est lancé dans un shell non-interactif

    Les variables d'environnement ont une portée locale. Ainsi une variable déclarée dans un shell ne sera valide que pour ce shell et ses enfants (mais pas pour un sous-shell non interactif, comme celui lancé par un script notamment).
    Ex:
    si je définis la variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    variable="test"
    echo "$variable"
    ne renverra test que dans le shell courant
    Si l'on crée le script test.sh avec pour contenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    echo "$variable"
    L'exécution du script renverra une valeur vide puisque le script s'est exécuté dans un shell non-interactif.
    En revanche, si je définis la variable
    lorsque je lance un éditeur de texte depuis ce terminal, il se lancera en langue anglaise. Il y a bien héritage.

    Pour qu'une variable ait une porté générale, il faut l'exporter par
    N'importe quel shell (sauf un shell non-interactif, comme après lancement d'un script) aura accès à la valeur.

    Cette valeur sera perdue après la fermeture de la session.

    Pour disposer de cette valeur de manière permanente au niveau de la session, il faut l'inscrire dans un des fichiers d'environnement .bashrc, .bash_profile, .profile

    Usage de ces différents fichiers (repris depuis doc.ubuntu-fr.org)

    - ~/.profile - C'est probablement le meilleur endroit pour placer une définition de variable d'environnement. En effet, il est exécuté automatiquement par le gestionnaire de connexion lors du démarrage d'une session graphique, mais aussi lors du démarrage d'une session en mode console texte.
    ~/.bash_profile ou ~/.bash_login - Si l'un de ces fichiers existe, il sera exécuté par Bash préférentiellement à ~/.profile lors d'une connexion sur une console. (Bash utilisera ~/.bash_profile de préférence à ~/.bash_login). Cependant, ces fichiers n'auront par défaut aucune influence sur une session en mode graphique.
    - ~/.bashrc - Du fait de la manière dont Ubuntu configure par défaut les divers fichiers de scripts, c'est sans doute l'endroit le plus facile pour définir des variables. La configuration par défaut garantit a peu près que ce fichier sera exécuté à chaque invocation de *bash* ainsi que lors de la connexion à l'environnement graphique. Cependant du point de vue des performances, ce n'est pas l'idéal car les variables seront inutilement redéfinies à chaque fois. (NdT : à chaque fois que vous ouvrez un terminal par exemple?)

    Comment définir des variables qui seront accessibles depuis des shell non-interactifs (donc des scripts) ?
    On peut créer un script contenant les variables et leurs valeurs par exemple :
    .variables.sh
    Dans les scripts, on pourra accéder à ces valeurs en inscrivant dans le script la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    source $HOME/.variables.sh
    ou
    Il est possible d'inscrire le chemin vers ce fichier dans la variable BASH_ENV, par exemple dans .profile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export BASH_ENV=$HOME/.variables.sh
    Dès lors je peux y faire appel dans les scripts par
    Merci de corriger les éventuelles erreurs et imprécisions.
    .
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    Par défaut
    Les variables d'environnement ont une portée locale. Ainsi une variable déclarée dans un shell ne sera valide que pour ce shell et ses enfants (mais pas pour un sous-shell non interactif, comme celui lancé par un script notamment).
    J'ai beaucoup de mal avec ce passage.

    • Déjà je n'aurais pas mis "et ses enfants". Pas ses enfants, puisqu'il faut l'exporter.
    • Ensuite, le paradoxe entre "portée locale" et "variable d'environnement" étonne. Tu montres toi-même que LANG n'est pas si locale que ça puisque la valeur est la même dans le script enfant.
    • Enfin, la remarque sur l'interactivité n'a rien à voir avec la portée. Dans ton premier message, tu mettais en opposition l'indisponibilité d'une valeur dans un script alors que tu l'avais défini dans .bashrc.Ce que t'as précisé disedorgue, c'est que le .bashrc n'est exécuté que quand tu lances la console. Ainsi la valeur est disponible dans la console. Mais pas ses enfants. Or un script est un enfant. Donc, indisponibilité dans le script. À moins de transmettre ou exporter.

Discussions similaires

  1. Portée des variables: Include dans une fonction
    Par BlindeKinder dans le forum Langage
    Réponses: 9
    Dernier message: 08/02/2011, 18h45
  2. [MySQL] Portée des variables dans un même script
    Par paintbox dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/07/2010, 20h11
  3. Portée des variables et pointeurs dans une procédure
    Par gicquairea dans le forum WinDev
    Réponses: 6
    Dernier message: 02/10/2007, 11h52
  4. portée des variables globales dans un fichier js
    Par crakazoid dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 14/04/2006, 16h49

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