Que fait l'exportation à BASH? [dupliquer]

75

Duplication possible:
Différence entre “a = b” et “export a = b” dans bash

C'est difficile à admettre, mais je n'ai jamais vraiment compris ce que exportfait exactement une variable d'environnement. Je sais que si je n'exporte pas de variable, je ne la vois parfois pas dans les processus enfants, mais parfois, j'ai l'impression que je peux le faire. Qu'est-ce qui se passe vraiment quand je dis

export foo=5

et quand ne devrais-je pas exporter une variable?

Chas. Owens
la source
Voici un lien vers au moins une autre question utile sur ce sujet: superuser.com/questions/143413/linux-environment-variables ... puisque, ironiquement, cette question était la première à apparaître sur Google pour ma requête sur l'exportation à bash .
Ogre Psalm33 le
1
Aussi: superuser.com/questions/18988/…
Ogre Psalm33
Une utilisation courante consiste à ajouter des exportinstructions à .bashrc / .bash_profile pour créer des variables globales persistantes similaires à $HOME.
Evan Plaice
Attention, cette histoire ne se résume pas à ce qu’elle semble au départ. Je vous invite à vérifier ma réponse.
jasonleonhard

Réponses:

15

De man bash:

ENVIRONNEMENT

Lorsqu'un programme est appelé, il se voit attribuer un tableau de chaînes appelé environnement. Ceci est une liste de paires nom-valeur, de la forme nom = valeur.

Le shell fournit plusieurs façons de manipuler l'environnement. Lors de l'appel, le shell analyse son propre environnement et crée un paramètre pour chaque nom trouvé, le marquant automatiquement pour l'exportation vers les processus enfants. Les commandes exécutées héritent de l'environnement. Les commandes export et declare -xpermettent aux paramètres et fonctions d'être ajoutés et supprimés de l'environnement. Si la valeur d'un paramètre dans l'environnement est modifiée, la nouvelle valeur devient une partie de l'environnement et remplace l'ancienne. L'environnement hérité par toute commande exécutée est constitué de l'environnement initial du shell, dont les valeurs peuvent être modifiées dans le shell, moins les paires supprimées par la unset commande, plus les ajouts via l'exportation et les declare -xcommandes.

petit
la source
74
IMHO copier-coller un extrait de documentation sans effort supplémentaire d'explication ne devrait pas être voté.
Artur
30
Cet extrait n'est pas très clair et, franchement, je n'ai pas compris ce qui se passait.
Trismegistos
4
@Artur: au contraire: si (la partie de la) documentation répond à une question, je préférerais ne pas avoir d'explications supplémentaires.
René Nyffenegger
1
@ RenéNyffenegger, mais apparemment, ce n'est pas le cas. Au moins, je ne l’ai pas eu avant de lire une réponse de BloodPhilia qui devrait être marquée comme acceptée.
Vladislav Rastrusny
1
Je crois que les points soulevés par Artur et Trismegistos sont que n'importe qui peut copier-coller, ce n'est pas toujours suffisant, clarifier et donner une bonne réponse. C'est bien de copier-coller de la documentation ou de fournir un lien. En fait, c'est encourageant, mais il devrait y avoir une explication de qualité supplémentaire. En outre, des personnes telles que RenéNyffenegger peuvent facilement ignorer cette explication si elles n'en ont pas besoin, mais elle sera disponible pour ceux qui en bénéficieront. Nous essayons tous d'apprendre et nous comprenons de différentes manières. Cela nous permet de couvrir une variété de styles d'apprentissage et d'améliorer votre note.
jasonleonhard
99

Les variables exportées sont transmises aux processus enfants, pas les variables non exportées.

BloodPhilia
la source
Pouvez-vous indiquer n'importe quelle documentation à cet effet. Je cherche plus d'informations que cela. Par exemple, une variable doit-elle être exportée une seule fois ou devez-vous l'exporter après chaque modification, etc.
Chas. Owens
1
Vous pouvez vérifier ceci: superuser.com/questions/143413/linux-environment-variables/…
BloodPhilia
3
Vous pouvez le vérifier en ajoutant quelque chose à un chemin (dire à PYTHONPATH) et en notant que même si vous le pouvez, echo $PYTHONPATHil ne sera pas reconnu par les scripts python ou bash tant que vous exportne l' aurez pas
Kaushik Ghose
Cette réponse ne semble pas être entièrement vraie non plus. Les sous-shells Bash, par exemple, sont destinés à des processus enfants (selon $BASHPID) et pourtant vous pouvez lire des variables non exportées à partir du shell parent. Preuve simple: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") Mon hypothèse est qu'il s'agit d'un cas spécial qui se produit lorsque le processus enfant est un sous-shell.
JepZ
20

Lorsque vous utilisez export, vous ajoutez la variable à la liste des variables d'environnement du shell dans laquelle la commande d'exportation a été appelée et toutes les variables d'environnement d'un shell sont transmises aux processus enfants, raison pour laquelle vous pouvez les utiliser.

Lorsque vous avez terminé le shell, son environnement est détruit, c’est pourquoi les variables d’environnement sont déclarées et exportées lors de la connexion, dans le fichier .bashrc par exemple.

Alfredo
la source