Por que as duas maneiras a seguir de mostrar variáveis ​​de ambiente do shell atual são diferentes?

Por que as duas maneiras a seguir de mostrar variáveis ​​de ambiente do shell atual são diferentes?

Eu encontrei o pid do meu shell bash

$ echo $$
7791

Em seguida, verifico suas variáveis ​​de ambiente de duas maneiras diferentes:

$ cat /proc/7791/environ | tr '\0' '\n'

dehttps://stackoverflow.com/a/532284/156458, e

$ env

No entanto, seus resultados não são idênticos. Por exemplo, eles mostram valores diferentes de PATH. Por que eles diferem? Obrigado.

Responder1

Você deve ler os comentários abaixo dessa resposta enganosa.

/proc/$PID/environnão é usado ao vivo pelo shell. Representa apenas o ambiente inicial do processo quando foi lançado.

Qualquer coisa feita no shell, incluindo seus scripts de inicialização, pode alterar esses valores dentro do shell sem alterar a procentrada que você está vendo.

Responder2

/proc/7791/environmostra o ambiente original do shell, conforme foi recebido pelo processo quando foi iniciado usando a chamada de sistema execve:

 int execve(const char *filename, char *const argv[], char *const envp[]);

Quando o shell está em execução, ele pode alterar seu conjunto de variáveis ​​exportadas, por exemplo, avaliando .bashrc. Este novo conjunto é então passado no vetor envpquando o envprograma é iniciado.

Responder3

Seja qual for o problema que você está tentando resolver, você pode tentar usar

/proc/self

resolve isso. Em vez de obter o ambiente inicial do shell, um

cat /proc/self/environ

exibe o ambiente do catcomando, que deve ser igual ao ambiente atual do shell em que ele é executado.

informação relacionada