É importante entender que todo processo tem seu próprio conjunto de variáveis de ambiente.
Quando um processo chama a chamada de sistema fork()
, um segundo processo (o filho ) idêntico ao primeiro ( o pai ) é criado (este copy inclui o ambiente, que reside logo acima da pilha (ou logo abaixo, dependendo de como você pensa em pilhas :-)
- mas em unix / linux a pilha cresce para baixo em endereços altos) .
Normalmente, o processo filho chamará a chamada de sistema execve()
, que descartará tudo em sua memória (virtual) e reconstruirá a partir das seções de código e dados no arquivo binário especificado .
No entanto, quando reconstrói a pilha, ele copia as seqüências de caracteres do ambiente e do argumento passadas para execve()
na pilha primeiro (nessa ordem), antes de chamar a função main()
(muito do trabalho é feito no código de bootstrap crt0
após o execve()
retorna (para o ponto de entrada especificado no binário)).
Existem invólucros para a chamada de sistema execve()
na biblioteca C que passará no ambiente atual (ou seja, uma cópia do ambiente dos pais), em vez de o chamador fornecer (assim, de fato, a criança herdará o ambiente do pai) - veja environ(7)
.
Tente executar (como root) o comando ps axeww | less
... isto mostrará o ambiente para os processos all ! Um interessante é o id do processo 1 (ou seja, o init
process - o primeiro processo criado pelo kernel no momento da inicialização).
Se você quiser olhar o ambiente para um processo específico (e você sabe qual é o id do processo), tente executar o comando cat /proc/<PID>/environ
(substituindo <PID>
pelo ID do processo).
Note que se um processo tem privilégios suficientes, ele pode reescrever sua própria pilha, o que pode tornar difícil saber qual é o seu ambiente - você verá alguns processos daemon como este na saída do ps.
Mas no final, todo esse waffle se resume ao que @chaos disse acima, se você quiser ver o valor atual de uma variável de ambiente específica no seu processo shell, apenas use o comando (builtin) echo "$<NAME>"
( substituindo <NAME>
pelo nome da variável de ambiente em que você está interessado ... apenas esteja ciente de que a mesma variável pode ter um valor diferente, ou não existir, em outro processo.