É importante entender que todo processo tem seu próprio conjunto de variáveis de ambiente.
Quando um processo chama a chamada do fork()
sistema, é criado um segundo processo (o filho ) idêntico ao primeiro ( o pai ) (esta cópia inclui o ambiente, que reside logo acima da pilha (ou logo abaixo, dependendo de como você pensa nas pilhas :-)
- mas no unix / linux a pilha cresce a partir de endereços altos).
Geralmente, o processo filho chama a chamada de execve()
sistema, que descarta tudo na memória (virtual) e a reconstrói das seções de código e dados no arquivo binário especificado.
No entanto, quando reconstrói a pilha, ele copia o ambiente e as seqüências de argumentos passadas para execve()
a pilha primeiro (nessa ordem), antes de chamar a main()
função (muito do trabalho é feito no crt0
código de autoinicialização após os execve()
retornos (para a entrada ponto especificado no binário)).
Existem invólucros para a execve()
chamada do sistema na biblioteca C que passarão pelo ambiente atual (ou seja, uma cópia do ambiente dos pais), em vez de o responsável pela chamada (assim, na verdade, a criança herdará o ambiente dos pais) - veja environ(7)
.
Tente executar (como root) o comando ps axeww | less
... isso mostrará o ambiente para todos os processos! Uma interessante é a identificação do processo 1 (ou seja, o init
processo - o primeiro processo criado pelo kernel no momento da inicialização).
Se você deseja examinar o ambiente para um processo específico (e você sabe que é o ID do processo), tente executar o comando cat /proc/<PID>/environ
(substituindo <PID>
pelo ID do processo).
Observe que, se um processo tiver privilégios suficientes, ele pode reescrever sua própria pilha, o que pode dificultar o conhecimento de seu ambiente - você verá alguns processos daemon como esse na saída ps.
Mas, no final, todo esse waffle se resume ao que o @chaos disse acima, se você quiser examinar o valor atual de uma variável de ambiente específica no seu processo de shell, basta usar o comando echo "$<NAME>"
( builtin) (substituindo <NAME>
pelo nome do variável de ambiente em que você está interessado) ... esteja ciente de que a mesma variável pode ter um valor diferente ou não existir em outro processo.
echo
é uma má escolha de um comando, pois pode transformar o conteúdo da variável. Ele exibirá o conteúdo do parâmetro shell com o mesmo nome. Isso não é necessariamente o mesmo se você estiver usando o shell Bourne ou em ambientes como1
,*
por exemplo. E você não pode usar essa abordagem para envs cujo nome não é válido como um nome de variável do shell.