Variable shell vs variable d'environnement, laquelle est préférée si les deux portent le même nom?

10

Taper ce qui suit dans Bash:

env | grep USER

et

set | grep USER

donne aux deux fois le même nom d'utilisateur.

Comment savoir, par exemple lors de la saisie, echo $USERsi le shell ou la variable d'environnement a été affiché?

sharkant
la source

Réponses:

14

Pour les shells compatibles POSIX (y compris Bash), la norme dit:

2.5.3 Variables du shell Les
variables doivent être initialisées à partir de l'environnement [...] Si une variable est initialisée à partir de l'environnement, elle doit être marquée pour l'exportation immédiatement; voir l'export spécial intégré. De nouvelles variables peuvent être définies et initialisées avec des affectations de variables, [etc.]

Et sur export:

export name[=word]...
Le shell doit attribuer l'attribut export aux variables correspondant aux noms spécifiés, ce qui doit les placer dans l'environnement des commandes exécutées ultérieurement.

Du point de vue du shell, il n'y a donc que des variables. Certains d'entre eux peuvent provenir de l'environnement au démarrage du shell, et certains d'entre eux peuvent être exportés vers l'environnement des processus que le shell démarre.

(L '"environnement" n'est en réalité qu'un tas de chaînes passées au processus lorsqu'il démarre. Lorsque le processus est en cours d'exécution, il peut faire ce qu'il veut avec cela, l'utiliser, l'ignorer, l'écraser. Et ce qu'un processus transmet lors du démarrage d'autres processus peut être une autre chose, mais bien sûr, il est habituel de simplement transmettre à nouveau toutes les variables d'environnement.)


Si vous utilisiez un shell non POSIX, tel que csh, les choses pourraient être différentes:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
ilkkachu
la source
1
Notez que le shell Bourne, comme csh, initialise les variables shell à partir des variables d'environnement. Mais la modification des variables shell n'affecte pas la variable d'environnement correspondante, sauf si vous les exportez. C'est quelque chose qui a été brisé par le shell Korn (et spécifié par POSIX). C'est pourquoi vous devez faire attention au nom des variables shell que vous utilisez maintenant pour vous assurer que vous ne modifiez pas les variables env qui pourraient affecter les commandes que vous exécutez dans votre script.
Stéphane Chazelas
4

Ce sont la même variable. Dans le shell, contrairement à la plupart des autres langages de programmation, les variables d'environnement et les variables de shell partagent le même espace de noms. Dans le shell, une variable d'environnement est une variable shell qui a été exportée avec export.

Voir, par exemple, ma réponse à votre question précédente " Quelle est la différence d'utilisation entre les variables shell et les variables d'environnement? "

Kusalananda
la source
je vais relire votre explication, seulement je dois d'abord apprendre certaines choses, avant de pouvoir comprendre votre réponse.
sharkant
@sharkant Pas de soucis du tout. Si je suis confus, dites-le moi et je vais essayer de clarifier. La réponse d'ilkkachu est également bonne.
Kusalananda
non, je ne pense pas, tu as un bon style d'explication, c'est seulement mon manque de connaissance qui ne peut pas encore les chérir.
sharkant
2

La variable shell ne peut être utilisée que pour le shell actuel, elle ne peut pas être utilisée à l'échelle du système. À l'autre extrémité, la variable environnementale peut être utilisée à l'échelle du système. Par convention, la variable shell est écrite en minuscules tandis que la variable environnementale est écrite en majuscules. Vous pouvez faire fonctionner une variable shell comme variable d'environnement, il vous suffit de l'exporter.

Nazmul Ahmed Noyon
la source