Jai créé une variable denvironnement dans une fenêtre de terminal et jai essayé de la faire écho dans une autre fenêtre de terminal. Cela naffichait rien.

$TEST=hello 

Après cela, je lai exporté et essayé à nouveau de echo dans une autre fenêtre de terminal . le résultat était le même quavant.

export TEST 

mais si jexécute le même code à la connexion (en ajoutant le code à ~/.profile file) peuvent être utilisées dans nimporte 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 lexécuter lors de la connexion?

Réponse

export fait une variable quelque chose qui sera inclus dans les environnements de processus enfants. Cela naffecte pas les autres environnements déjà existants. En général, il ny a pas « de moyen de définir une variable dans un terminal et de la faire apparaître automatiquement dans un autre terminal, lenvironnement est établi pour chaque processus seul.

Lajouter à votre .profile fait en sorte que votre environnement soit configuré pour inclure cette nouvelle variable à chaque fois que vous vous connectez. Ainsi, elle n’est pas exportée d’un shell à un autre, mais demande à un nouveau shell d’inclure il lors de la configuration de l’environnement initial.

Réponse

Chaque processus a plusieurs attributs que le processus peut définir individuellement et indépendamment de dautres processus. Les exemples sont les limites de ressources, umask, le répertoire actuel, les variables denvironnement et bien dautres. Lors de la création du processus (via lappel système fork()), lenfant hérite de ces attributs du parent. Après cela, le processus enfant peut définir ces attributs de manière arbitraire. (Certaines restrictions sappliquent, un processus ne peut pas augmenter les limites de ressources matérielles ou changer son répertoire actuel vers un répertoire pour lequel il na pas de permission dexécution.)

Seuls quelques programmes modifient leurs variables denvironnement, la plupart ne le dérangent pas . Supposons le dernier cas. Donc, si un processus enfant crée lui-même dautres enfants, alors ces processus auront les mêmes variables denvironnement que le grand-parent. Et ainsi de suite.

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

Par conséquent, lors de la connexion, il y a un shell qui lit les données de profil (par exemple ~/.profile) et les hérite à pratiquement tous les enfants, petits-enfants, etc. Cest ainsi que les paramètres de la variable denvironnement descendent du shell de connexion ou du script de connexion à tous les autres programmes lancés pendant la session de connexion.

Jai créé une variable denvironnement dans une fenêtre de terminal et a essayé de faire écho dans une autre fenêtre de terminal. Cela naffiche rien.

Par lexplication ci-dessus, cest le résultat attendu. Les changements dans lenvironnement dun processus naffectent que les enfants de ce processus qui sont désormais créés, pas ceux existants.

$TEST=hello

Il est peu probable que cela fonctionne de toute façon, à moins que lexpansion des variables ne soit désactivée ou que $TEST ait déjà un valeur appropriée. Si vous souhaitez attribuer hello à la variable TEST, vous devez dire TEST=hello (remarque : no $).

Après cela, je lai exporté et réessayé vers echo dans une fenêtre de terminal différente. le résultat était le même quavant.

Encore une fois, cest le résultat attendu.

mais si jexécute le même code à la connexion (en ajoutant le code au fichier ~/.profile), les variables peuvent être utilisées dans nimporte quelle fenêtre de terminal.

Ceci est dû au fait que le shell du terminal est un descendant du shell qui lit les paramètres denvironnement de ~/.profile et hérite donc de ces paramètres.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *