2009-03-24 5 views
1

Lorsque j'exécute des commandes d'environnement, telles que env, set et unset, quelque chose se produit, mais quoi?Que faites-vous avec les variables d'environnement?

set hello='hello world!' 
unset find 

Que faites-vous avec les commandes? Les changements sont-ils permanents ou temporaires? Où pouvez-vous voir les changements? Je suis un novice d'Ubuntu.

+0

ce n'est pas le bon endroit pour ce genre de question, j'imagine que le forum de la communauté Ubuntu serait meilleur. – ninesided

+0

ninesided J'essaie de garder les choses simples. S'il vous plaît, ne laissez pas le titre vous confondre. J'ai supposé la perspective implicitement liée à la programmation. Je veux entendre la perspective des programmeurs. –

Répondre

2

Chaque processus créé obtient son propre environnement qui vit aussi longtemps que le processus. Votre coquille est comme n'importe quel autre processus. Son environnement est le sien.

Si vous tapez 'set' sans arguments, vous verrez ce qui existe. Beaucoup de ces paramètres sont là pour contrôler le comportement du programme .. votre chemin de recherche, l'affichage X11 désiré, le répertoire personnel (sinon/home/yourname), etc.

L'utilisation est vraiment ce dont vous avez besoin. Chaque fois que vous avez besoin de stocker des informations utiles (comme une longue liste d'options de ligne de commande pour un programme) dans une variable que d'autres applications peuvent lire ou auxquelles vous pouvez accéder à partir du shell, utilisez l'environnement.

Par exemple:

USUAL_CONFIGURE_OPTS="--prefix=/home/charlie --sysconfdir=/home/charlie/tmp-etc" 
./configure $USUAL_CONFIGURE_OPTS --and-additional-arguments 

Edit:

En tant que programmeur, je lis l'environnement pour déterminer les préférences de l'utilisateur et leur obéir. Par exemple, la variable POSIXLY_CORRECT influence la sortie de mes programmes si elle est définie. L'environnement est l'endroit où l'utilisateur dit aux programmes comment se comporter. Il arrive aussi, l'environnement est un endroit pratique pour l'utilisateur pour stocker des bits utiles, comme je l'ai décrit ci-dessus.

Encore une fois (répondant à votre commentaire), chaque programme qui est exécuté est un processus. Un processus obtient son propre espace d'adressage (propre mémoire), son environnement est stocké dans cet espace. Cela signifie que l'environnement est spécifique à ce processus et ne vit que aussi longtemps que le processus lui-même.

Edit 2:

Je pense que maintenant je comprends parfaitement votre question. Si quelqu'un dit 'environnement virtuel', il remarque simplement que l'environnement réside dans l'espace adresse de l'application, qui est mappé par le noyau en tant que mémoire virtuelle (certaines pages peuvent être en mémoire physique, d'autres en swap, objets dynamiques partagés, etc).

Aucun processus ne peut accéder à l'environnement d'un autre utilisateur à moins que le processus ne crée explicitement une mappe dans cette région spécifique et la partage avec un autre processus. Encore une fois, l'espace d'adressage d'un processus est complètement privé et isolé des autres processus. Les variables environnementales vivent dans cet espace d'adressage, sinon le processus ne peut pas les accéder ou les manipuler.

+0

J'ai compris d'Unix Power Tools que vous pouvez considérer presque tout dans le texte Linux. Dans un chapitre ultérieur, il a ajouté que la déclaration n'est pas totalement vraie. Donc, je suis confus par votre utilisation du terme «processus». Les processus peuvent envoyer des signaux, ils sont des textes et - comment sont-ils vraiment définis? –

+0

@UnixBasics, chaque processus nouvellement créé (un programme exécuté) obtient son propre espace d'adressage en mémoire. C'est complètement isolé de tout autre processus. Le processus A ne peut pas lire la mémoire du processus B, sauf si la mémoire partagée est explicitement configurée. L'environnement de chaque processus est le leur. –

+0

@tinkertim Merci pour votre explication! Lorsque les programmeurs parlent de variables d'environnement «virtuelles», que signifient-ils? Le processus A a une place exacte dans la mémoire virtuelle, à laquelle d'autres programmes peuvent accéder (mais n'accèdent pas à la mémoire réelle (?) De A). Les env.vars sont-ils partagés ou seulement les env.vars virtuels de A? –

4

Les modifications sont temporaires. Ils persistent uniquement dans le shell actuel. Lorsque vous définissez une variable d'environnement dans votre ~/.profile ou ~/.bash_profile (utilisez simplement celle qui existe déjà, utilisez ls -a ~ pour le voir), elles seront effectivement permanentes, car ces fichiers sont "source" chaque fois que vous ouvrez un nouveau shell.

Par exemple, si vous avez ajouté:

export HELLO="world" 

Pour votre ~/.profile, cette variable deviendrait disponible chaque fois que vous ouvrez un nouveau shell (vous pouvez rafraîchir votre shell en cours avec source ~/.profile). Vous pouvez le tester avec:

$ echo $HELLO 
world 

Les variables d'environnement sont utilisées pour les scripts sur tout votre système. Vous pouvez faire des choses comme définir votre éditeur préféré, par exemple:

export EDITOR="nano" 

Une chose utile que vous pouvez faire est de définir votre chaîne d'invite, par exemple:

Bill:~$ export PS1="\u is awesome$ " 
Bill is awesome$ ls 
Bill is awesome$ du -h 
Bill is awesome$ ...etc... 
0

Tout comme pour la liste d'arguments, une section de mémoire est allouée au processus qui stocke les variables d'environnement. Je crois que c'est une liste non triée séparée des paires KEY = VALUE.

Ce bit de mémoire est copié avec tous les fork() et non effacé par exec() afin que les modifications soient copiées dans les processus enfants.

Les shells Unix n'écrivent pas de variables dans cette mémoire de variables d'environnement tant que export n'est pas utilisé. C'est la différence entre les variables shell et les variables d'environnement.

Dans le shell bash, "x=2" ne définit pas de variable d'environnement. "export x=2" ou "x=2; export x" fait.

Questions connexes