Cada proceso tiene varios atributos que el proceso puede establecer individualmente e independientemente de otros procesos. Ejemplos son los límites de recursos, umask, directorio actual, variables de entorno y algunos más. Al crear el proceso (a través de la fork()
llamada al sistema) el niño hereda estos atributos del padre. Después de esto, el proceso secundario puede establecer estos atributos arbitrariamente. (Se aplican algunas restricciones, un proceso puede no aumentar los límites de recursos duros o cambiar su directorio actual a un directorio para el que no tiene permiso de ejecutivo).
Solo unos pocos programas modifican sus variables de entorno, la mayoría no se molesta. Supongamos el último caso. Entonces, si un proceso hijo crea más hijos, entonces estos procesos tendrán las mismas variables de entorno que el abuelo. Y así.
Ahora, un shell tiene muchas variables con las que se puede ver set
(en shells de tipo Bourne Shell, no sé acerca de C Shell). Estas variables no son variables de entorno a menos que se export
editen. Las variables de entorno se pueden ver con env
. Si inicia un programa desde la línea de comandos del shell, el programa heredará las variables de entorno del shell. Del mismo modo para un programa lanzado desde un script de shell.
Por lo tanto, al iniciar sesión hay un shell que lee los datos del perfil (p ~/.profile
. Ej. ) Y los hereda a prácticamente todos los hijos, nietos, etc. Así es como la configuración de las variables de entorno se filtra desde el shell de inicio de sesión o el script de inicio de sesión a todos los demás programas iniciados dentro de la sesión de inicio de sesión.
Creé una variable de entorno en una ventana de terminal e intenté repetirla en otra ventana de terminal. Eso no mostró nada.
Por la explicación anterior, este es el resultado esperado. Los cambios en el entorno de un proceso afectan solo a los hijos de este proceso que se crean en adelante, no a los existentes.
$TEST=hello
Es poco probable que esto funcione de todos modos, a menos que la expansión variable esté desactivada o $TEST
ya tenga un valor adecuado. Si desea asignar hello
a variable, TEST
entonces tiene que decir TEST=hello
(nota: no $
).
Después de eso lo exporté e intenté nuevamente echo
en una ventana de terminal diferente. El resultado fue el mismo que antes.
Una vez más, este es el resultado esperado.
pero si ejecuto el mismo código en el inicio de sesión (agregando el código al ~/.profile
archivo), las variables se pueden usar en cualquier ventana de terminal.
Esto se debe a que el shell en el terminal es un descendiente del shell que lee la configuración del entorno ~/.profile
y, por lo tanto, hereda esta configuración.