Creé una variable de entorno en una ventana de terminal e intenté repetirla en otra ventana de terminal. Eso no mostró nada.
$TEST=hello
Después de eso, lo exporté y lo intenté de nuevo echo
en una ventana de terminal diferente . el resultado fue el mismo que antes.
export TEST
pero si ejecuto el mismo código en el inicio de sesión (agregando el código a ~/.profile
file) se pueden utilizar en cualquier ventana de terminal. ¿Que está sucediendo aquí? ¿Cuál es la diferencia entre ejecutar un código en una terminal y ejecutar el mismo en el inicio de sesión?
Responder
export
hace que una variable sea algo que se incluirá en los entornos de procesos secundarios. No afecta a otros entornos ya existentes. En general, no hay forma de establecer una variable en un terminal y hacer que aparezca automáticamente en otro terminal, el entorno se establece para cada proceso por sí solo.
Agregándolo a su .profile
hace que su entorno se configure para incluir esa nueva variable cada vez que inicie sesión. Por lo tanto, no se exporta de un shell a otro, sino que le indica a un nuevo shell que incluya cuando configura el entorno inicial.
Respuesta
Cada proceso tiene varios atributos que el proceso puede establecer individual e independientemente de otros procesos. Los ejemplos son límites de recursos, umask, directorio actual, variables de entorno y algunos más. Tras la creación del proceso (a través de la llamada al sistema fork()
), el hijo hereda estos atributos del padre. Después de esto, el proceso hijo puede establecer estos atributos de forma arbitraria. (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 ejecución).
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 a sí mismo más hijos, entonces estos procesos tendrán las mismas variables de entorno que el abuelo. Y así sucesivamente.
Ahora, un shell tiene muchas variables que se puede ver con set
(en shells de tipo Bourne Shell, no sé sobre C Shell). Estas variables no son variables de entorno a menos que sean export
ed. 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 iniciado desde un script de shell.
Por lo tanto, al iniciar sesión, hay un shell que lee los datos del perfil (por ejemplo, ~/.profile
) y los hereda a prácticamente todos los hijos, nietos, etc. Así es como la configuración de la variable 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é repetirlo en otra ventana de terminal. Eso no mostró nada.
Según 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 de variables esté desactivada o $TEST
ya tenga una valor adecuado. Si desea asignar hello
a la variable TEST
, debe decir TEST=hello
(nota : no $
).
Después de eso, lo exporté y volví a intentarlo a
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 archivo
~/.profile
), las variables se pueden usar en cualquier ventana de terminal.
Esto se debe a que el shell en la terminal es un descendiente del shell que lee la configuración del entorno de ~/.profile
y por lo tanto heredó esta configuración.