È importante capire che ogni processo ha il proprio set di variabili d'ambiente.
Quando un processo chiama la fork()chiamata di sistema, viene creato un secondo processo (il figlio ) identico al primo ( il genitore ) (questa copia include l'ambiente, che si trova appena sopra lo stack (o appena sotto, a seconda di come pensi agli stack :-)) ma in Unix / Linux lo stack cresce verso il basso dalle alte indirizzi).
Di solito, il processo figlio chiamerà quindi la chiamata di execve()sistema, che eliminerà tutto nella sua memoria (virtuale) e la ricostruirà dalle sezioni di codice e dati nel file binario specificato.
Tuttavia, quando ricostruisce lo stack, copia l'ambiente e le stringhe di argomenti passate allo execve()stack prima (in quell'ordine), prima di chiamare la main()funzione (gran parte del lavoro viene eseguito nel crt0codice bootstrap dopo i execve()ritorni (alla voce punto specificato nel binario)).
Ci sono wrapper per la execve()chiamata di sistema nella libreria C che passerà l'ambiente corrente (cioè una copia dell'ambiente genitore), invece del chiamante che lo fornisce (quindi in effetti il figlio erediterà l'ambiente del genitore) - vedi environ(7).
Prova a eseguire (come root) il comando ps axeww | less... questo ti mostrerà l'ambiente per tutti i processi! Un interessante è l'ID processo 1 (ovvero il initprocesso - il primo processo creato dal kernel all'avvio).
Se si desidera esaminare l'ambiente per un processo specifico (e si sa che è ID processo), provare a eseguire il comando cat /proc/<PID>/environ(sostituendolo <PID>con ID processo).
Nota che se un processo ha abbastanza privilegi, può riscrivere il proprio stack, il che può rendere difficile sapere quale sia il suo ambiente - vedrai alcuni processi daemon come questo nell'output ps.
Ma alla fine, tutto questo waffle si riduce a ciò che @chaos ha detto sopra, se vuoi guardare il valore corrente di una variabile d'ambiente specifica nel tuo processo di shell, usa semplicemente il comando echo "$<NAME>"( incorporato) (sostituendo <NAME>con il nome del variabile di ambiente che ti interessa) ... tieni presente che la stessa variabile può avere un valore diverso o non esistere affatto in un altro processo.
echoè una cattiva scelta di un comando in quanto potrebbe trasformare il contenuto della variabile. Produrrà il contenuto del parametro shell con lo stesso nome. Questo non è necessariamente lo stesso se si utilizza la shell Bourne o per ambienti simili1,*ad esempio. E non puoi usare questo approccio per env var il cui nome non è valido come nome di variabile di shell.