À quoi sert la commande «export»?

12

J'ai créé une variable d'environnement dans une fenêtre de terminal et j'ai essayé de l'écho dans une autre fenêtre de terminal. Cela n'affiche rien.

$TEST=hello

Après cela, je l'ai exporté et réessayé echodans une autre fenêtre de terminal. le résultat était le même qu'avant.

export TEST 

mais si j'exécute le même code lors de la connexion (en ajoutant le code au ~/.profilefichier), les variables peuvent être utilisées dans n'importe quelle fenêtre de terminal. Que se passe-t-il ici? Quelle est la différence entre exécuter un code dans un terminal et l'exécuter à la connexion?

DScript
la source

Réponses:

25

exportfait une variable quelque chose qui sera incluse dans les environnements de processus enfant. Il n'affecte pas les autres environnements déjà existants. En général, il n'y a aucun moyen de définir une variable dans un terminal et de la faire apparaître automatiquement dans un autre terminal, l'environnement est établi pour chaque processus de manière autonome.

L'ajouter à votre .profilefait en sorte que votre environnement soit configuré pour inclure cette nouvelle variable à chaque fois que vous vous connectez. Il n'est donc pas exporté d'un shell vers un autre, mais demande à la place à un nouveau shell de l'inclure lors de la configuration de l'environnement initial.

Eric Renouf
la source
1

Chaque processus a plusieurs attributs que le processus peut définir individuellement et indépendamment des autres processus. Les exemples sont les limites de ressources, umask, le répertoire courant, les variables d'environnement et plus encore. Lors de la création du processus (via l' fork()appel système), l'enfant hérite de ces attributs du parent. Après cela, le processus enfant peut définir arbitrairement ces attributs. (Certaines restrictions s'appliquent, un processus peut ne pas augmenter les limites de ressources matérielles ou changer son répertoire actuel en un répertoire pour lequel il n'a aucune autorisation d'exécution.)

Seuls quelques programmes modifient leurs variables d'environnement, la plupart ne s'en soucient pas. Supposons le dernier cas. Donc, si un processus enfant se crée d'autres enfants, ces processus auront les mêmes variables d'environnement que les grands-parents. Etc.

Maintenant, un shell a beaucoup de variables qui peuvent être visualisées avec set(dans les shells de type Bourne Shell, ne sais pas sur C Shell). Ces variables ne sont pas des variables d'environnement sauf si elles sont exportéditées. Les variables d'environnement peuvent être visualisées avec env. Si vous lancez un programme à partir de la ligne de commande du shell, le programme héritera des variables d'environnement du shell. De même pour un programme lancé à partir d'un script shell.

Par conséquent, lors de la connexion, un shell lit les données de profil (par exemple ~/.profile) et les hérite de pratiquement tous les enfants, petits-enfants, etc. C'est ainsi que les paramètres des variables d'environnement descendent du shell de connexion ou du script de connexion vers tous les autres programmes lancés au cours de la session de connexion.

J'ai créé une variable d'environnement dans une fenêtre de terminal et j'ai essayé de l'écho dans une autre fenêtre de terminal. Cela n'affiche rien.

Par l'explication ci-dessus, c'est le résultat attendu. Les changements dans l'environnement d'un processus n'affectent que les enfants de ce processus qui sont créés désormais, pas ceux existants.

$TEST=hello

Il est peu probable que cela fonctionne de toute façon, sauf si l'expansion variable est désactivée ou $TESTa déjà une valeur appropriée. Si vous souhaitez attribuer helloà une variable, TESTvous devez le dire TEST=hello(remarque: non $).

Après cela, je l'ai exporté et réessayé echodans une autre fenêtre de terminal. le résultat était le même qu'avant.

Encore une fois, c'est le résultat attendu.

mais si j'exécute le même code lors de la connexion (en ajoutant le code au ~/.profilefichier), les variables peuvent être utilisées dans n'importe quelle fenêtre de terminal.

En effet, le shell dans le terminal est un descendant du shell qui lit les paramètres d'environnement ~/.profileet a donc hérité de ces paramètres.

contre-mode
la source