Il est important de comprendre que chaque processus a son propre ensemble de variables d'environnement.
Lorsqu'un processus appelle l' fork()
appel système, un deuxième processus (l' enfant ) identique au premier ( le parent ) est créé (cette copie inclut l'environnement, qui se trouve juste au-dessus de la pile (ou juste en dessous, selon la façon dont vous pensez des piles :-)
- mais sous unix / linux, la pile se développe à partir d'adresses élevées).
Habituellement, le processus enfant appellera alors l'appel execve()
système, qui jettera tout dans sa mémoire (virtuelle) et le reconstruira à partir du code et des sections de données dans le fichier binaire spécifié.
Cependant, quand il reconstruit la pile, il copie l'environnement et les chaînes d'arguments passées à execve()
la pile en premier (dans cet ordre), avant d'appeler la main()
fonction (une grande partie du travail est effectuée dans le crt0
code de démarrage après les execve()
retours (à l' entrée point spécifié dans le binaire)).
Il y a des wrappers pour l' execve()
appel système dans la bibliothèque C qui passeront l'environnement actuel (c'est-à-dire une copie de l'environnement des parents), au lieu que l'appelant le fournisse (donc en fait l'enfant héritera de l'environnement des parents) - voir environ(7)
.
Essayez d'exécuter (en tant que root) la commande ps axeww | less
... cela vous montrera l'environnement pour tous les processus! Un processus intéressant est l'ID de processus 1 (c'est-à-dire le init
processus - le premier processus créé par le noyau au démarrage).
Si vous souhaitez examiner l'environnement d'un processus spécifique (et vous savez que c'est l'ID de processus), essayez d'exécuter la commande cat /proc/<PID>/environ
(en la remplaçant <PID>
par l'ID de processus).
Notez que si un processus a suffisamment de privilèges, il peut réécrire sa propre pile, ce qui peut rendre difficile la connaissance de son environnement - vous verrez des processus démon comme celui-ci dans la sortie ps.
Mais à la fin, toute cette gaufre se résume à ce que @chaos a dit ci-dessus, si vous voulez regarder la valeur actuelle d'une variable d'environnement spécifique dans votre processus shell, utilisez simplement la commande echo "$<NAME>"
( intégrée) (en remplaçant <NAME>
par le nom de la variable d’environnement qui vous intéresse) ... sachez que la même variable peut avoir une valeur différente, ou n’exister pas du tout, dans un autre processus.
echo
est un mauvais choix de commande car il pourrait transformer le contenu de la variable. Il affichera le contenu du paramètre shell du même nom. Ce n'est pas nécessairement la même chose si vous utilisez le Bourne shell ou pour des vars env comme1
,*
par exemple. Et vous ne pouvez pas utiliser cette approche pour les vars env dont le nom n'est pas valide en tant que nom de variable shell.