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 $TEST
a déjà une valeur appropriée. Si vous souhaitez attribuer hello
à une variable, TEST
vous devez le dire TEST=hello
(remarque: non $
).
Après cela, je l'ai exporté et réessayé echo
dans 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 ~/.profile
fichier), 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 ~/.profile
et a donc hérité de ces paramètres.