Es importante comprender que cada proceso tiene su propio conjunto de variables de entorno.
Cuando un proceso llama a la fork()
llamada del sistema, se crea un segundo proceso (el hijo ) idéntico al primero ( el padre ) (esta copia incluye el entorno, que reside justo encima de la pila (o justo debajo, dependiendo de cómo piense en las pilas :-)
) pero en unix / linux la pila crece hacia abajo desde las direcciones de altura).
Por lo general, el proceso secundario llamará a la llamada del execve()
sistema, que desechará todo en su memoria (virtual) y reconstruirá a partir de las secciones de código y datos en el archivo binario especificado.
Sin embargo, cuando reconstruye la pila, copia el entorno y las cadenas de argumentos pasadas a execve()
la pila primero (en ese orden), antes de llamar a la main()
función (gran parte del trabajo se realiza en el crt0
código de arranque después de los execve()
retornos (a la entrada punto especificado en el binario)).
Hay envoltorios para la execve()
llamada al sistema en la biblioteca C que pasará el entorno actual (es decir, una copia del entorno de los padres), en lugar de que la persona que lo llama lo proporcione (de modo que el hijo heredará el entorno de los padres) - vea environ(7)
.
Intente ejecutar (como root) el comando ps axeww | less
... ¡esto le mostrará el entorno para todos los procesos! Una interesante es la identificación del proceso 1 (es decir, lainit
proceso: el primer proceso creado por el núcleo en el momento del arranque).
Si desea ver el entorno para un proceso específico (y sabe que es la identificación del proceso), intente ejecutar el comando cat /proc/<PID>/environ
(reemplazar <PID>
con la identificación del proceso).
Tenga en cuenta que si un proceso tiene suficientes privilegios, puede reescribir su propia pila, lo que puede dificultar saber cuál es su entorno: verá algunos procesos de daemon como este en la salida ps.
Pero al final, todo este waffle se reduce a lo que @chaos dijo anteriormente, si desea ver el valor actual de una variable de entorno específica en su proceso de shell, simplemente use el comando echo "$<NAME>"
( incorporado) (reemplazando <NAME>
con el nombre del variable de entorno que le interese) ... solo tenga en cuenta que la misma variable puede tener un valor diferente, o no existir, en otro proceso.
echo
es una mala elección de un comando, ya que podría transformar el contenido de la variable. Producirá el contenido del parámetro de shell con el mismo nombre. Eso no es necesariamente lo mismo si se usa el shell Bourne o para entornos como1
,*
por ejemplo. Y no puede usar ese enfoque para los entornos cuyo nombre no es válido como nombre de variable de shell.