¿Para qué sirve el comando "exportar"?


12

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é e intenté nuevamente echoen 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 al ~/.profilearchivo), las variables se pueden usar en cualquier ventana de terminal. ¿Que está sucediendo aquí? ¿Cuál es la diferencia entre ejecutar un código en un terminal y ejecutarlo al inicio de sesión?

Respuestas:


25

exportconvierte una variable en algo que se incluirá en entornos de procesos secundarios. No afecta a otros entornos ya existentes. En general, no hay una manera 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.

Sin embargo, al agregarlo a su .profileconfiguración, su entorno se configurará para incluir esa nueva variable cada vez que inicie sesión. Por lo tanto, no se exporta de un shell a otro, sino que se le indica a un nuevo shell que lo incluya cuando configura el entorno inicial.


1

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 exportediten. 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 $TESTya tenga un valor adecuado. Si desea asignar helloa variable, TESTentonces tiene que decir TEST=hello(nota: no $).

Después de eso lo exporté e intenté nuevamente echoen 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 ~/.profilearchivo), 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 ~/.profiley, por lo tanto, hereda esta configuración.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.