¿Por qué difieren las siguientes dos formas de mostrar las variables de entorno del shell actual?

¿Por qué difieren las siguientes dos formas de mostrar las variables de entorno del shell actual?

Encontré el pid de mi shell bash

$ echo $$
7791

Luego verifico sus variables de entorno de dos maneras diferentes:

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

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

$ env

Sin embargo, sus resultados no son idénticos. Por ejemplo, muestran diferentes valores de PATH. ¿Por qué difieren? Gracias.

Respuesta1

Deberías leer los comentarios debajo de esa respuesta engañosa.

/proc/$PID/environno es utilizado en vivo por el shell. Simplemente representa el entorno inicial del proceso cuando se lanzó.

Cualquier cosa que se haga en el shell, incluidos sus scripts de inicio, puede cambiar esos valores desde el shell sin cambiar la procentrada que está viendo.

Respuesta2

/proc/7791/environmuestra el entorno original del shell, tal como lo recibió el proceso cuando se inició mediante la llamada al sistema execve:

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

Cuando el shell se está ejecutando, puede cambiar su conjunto de variables exportadas, por ejemplo evaluando .bashrc. Este nuevo conjunto luego se pasa en el vector envpcuando envse inicia el programa.

Respuesta3

Cualquiera que sea el problema que estés intentando resolver, puedes intentarlo si utilizas

/proc/self

lo resuelve. En lugar de obtener el entorno inicial del shell, un

cat /proc/self/environ

muestra el entorno del catcomando, que debe ser igual al entorno actual del shell en el que se ejecuta.

información relacionada