¿Qué hace el comando 'exportar'?

85

Soy un poco nuevo en Linux y ejecuto algunos comandos a ciegas para hacer las cosas. Pensé que no sería un desperdicio hacer este tipo de preguntas, ya que más personas nuevas tendrían un conocimiento regular sobre ellas.

Comencé a trabajar con Jenkins recientemente y luego tuve que usar este exportcomando para ejecutar el archivo de guerra de Jenkins . Así que necesitaba saber qué exporthace el comando en general, y por qué necesitamos ejecutar este comando, mientras se ejecuta Jenkins (después de que se establece la casa de Jenkins).

¡Gracias!

Chathura Kulasinghe
fuente
1
Sería útil si dijera más sobre el comando de exportación que utilizó. Sin más contexto, supongo que estabas configurando una variable de entorno. Ver en.wikipedia.org/wiki/Environment_variable#Unix
Joshua D. Boyd
4
posible duplicado de bash: definir una variable con o sin exportación
tripleee
posible duplicado del comando de exportación
John Kugelman

Respuestas:

99

exportin shy shells relacionados (como bash), marca una variable de entorno para exportar a procesos secundarios, de modo que el niño los herede.

exportse define en POSIX :

El shell dará el atributo de exportación a las variables correspondientes a los nombres especificados, lo que hará que estén en el entorno de los comandos ejecutados posteriormente. Si el nombre de una variable va seguido de = palabra, el valor de esa variable se establecerá en palabra.

Yann Ramin
fuente
¡Muchas gracias! Todas sus respuestas fueron realmente útiles, ¡y también son guías para aprender algunas cosas más! :-)
Chathura Kulasinghe
1
¿Qué es un proceso hijo en este sentido?
Zinan Xing
13
No entiendo
Martin Hansen
@MartinHansen, ¿qué no entiendes? también, vea mi respuesta.
barlop
Hay un corchete adicional al final del enlace, no puedo editarlo, porque es una edición de un símbolo :)
Radoslav Stoyanov
27

Supongo que viene de un fondo de Windows. Así que los contrastaré (yo también soy un poco nuevo en Linux). Encontré la respuesta del usuario a mi comentario, útil para resolver las cosas.

En Windows, una variable puede ser permanente o no. El término variable de entorno incluye una variable establecida en el shell cmd con el comando SET, así como cuando la variable se establece dentro de la GUI de Windows, por lo que se establece en el registro y se vuelve visible en nuevas ventanas cmd. por ejemplo, documentación para el comando set en Windows https://technet.microsoft.com/en-us/library/bb490998.aspx "Muestra, establece o elimina variables de entorno. Si se utiliza sin parámetros, set muestra la configuración actual del entorno". En Linux, set no muestra variables de entorno, muestra variables de shell a las que no llama / se refiere como variables de entorno. Además, Linux no usa set para establecer variables (aparte de los parámetros posicionales y las opciones de shell, que explico como una nota al final), solo para mostrarlas e incluso entonces solo para mostrar variables de shell. Windows usa set para configurar y mostrar, por ejemplo, set a = 5, linux no.

En Linux, supongo que se podría hacer un script que los conjuntos de variables en el arranque, por ejemplo, /etc/profileo /etc/.bashrcpero por lo demás, no son permanentes. Están almacenados en RAM.

En Linux, existe una distinción entre variables de shell y variables de entorno. En Linux, las variables de shell están solo en el shell actual y las variables de entorno están en ese shell y en todos los shells secundarios.

Puede ver las variables de shell con el setcomando (aunque tenga en cuenta que, a diferencia de Windows, las variables no se configuran en Linux con el comando set).

set -o posix; set (hacer ese set -o posix una vez primero, ayuda a no mostrar demasiadas cosas innecesarias). Entonces setmuestra variables de shell.

Puede ver las variables de entorno con el envcomando

las variables de shell se establecen con, por ejemplo, solo a = 5

las variables de entorno se establecen con la exportación, la exportación también establece la variable de shell

Aquí puede ver la variable de shell zzz configurada con zzz = 5, y verá que se muestra cuando se ejecuta setpero no se muestra como una variable de entorno.

Aquí vemos yyy configurado con export, por lo que es una variable de entorno. Y vea que se muestra tanto en variables de shell como en variables de entorno

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

otros hilos útiles

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/environment-variable-vs-shell-variable-whats-the-difference

Nota: un punto que se elabora un poco y es algo correctivo de lo que he escrito, es que, en linux bash, 'set' se puede usar para establecer "parámetros posicionales" y "opciones / atributos de shell", y técnicamente ambos esas son variables, aunque es posible que las páginas de manual no las describan como tales. Pero aún así, como se mencionó, set no establecerá variables de shell o variables de entorno). Si lo hace set asdf, establece $ 1 en asdf, y si lo hace echo $1, ve asdf. Si lo hacesset a=5no establecerá la variable a, igual a 5. Establecerá el parámetro posicional $ 1 igual a la cadena de "a = 5". Entonces, si alguna vez vio el conjunto a = 5 en Linux, probablemente sea un error a menos que alguien realmente quiera esa cadena a = 5, en $ 1. La otra cosa que puede establecer el conjunto de Linux son las opciones / atributos de shell. Si establece -o, verá una lista de ellos. Y puede hacer, por ejemplo set -o verbose, off, para activar verbose (por cierto, el valor predeterminado está desactivado, pero eso no hace ninguna diferencia). O puede hacer set +o verbosepara desactivar verbose. Windows no tiene tal uso para su comando set.

barlop
fuente
parece que el conjunto muestra el shell y el entorno, y 'env' solo muestra el entorno
barlop
1
Me gusta mucho esta respuesta, ya que cubre casos de nix vs win que pueden ser confusos al principio.
Nada
6

En términos simples, las variables de entorno se establecen cuando abre una nueva sesión de shell. En cualquier momento, si cambia alguno de los valores de las variables, el shell no tiene forma de seleccionar ese cambio. eso significa que los cambios que realizó se harán efectivos en nuevas sesiones de shell. El exportcomando, por otro lado, brinda la capacidad de actualizar la sesión de shell actual sobre el cambio que realizó en la variable exportada. No tiene que esperar hasta una nueva sesión de shell para usar el valor de la variable que cambió.

katwekibs
fuente
1
Pero si digo a=5entonces echo $aentonces dice 5. Sin embargo, escribió "en cualquier momento si cambia alguno de los valores de las variables, el shell no tiene forma de seleccionar ese cambio. Eso significa que los cambios que hizo se harán efectivos en nuevas sesiones de shell". . <- Entonces, ¿cómo se actualizó la sesión de shell sin una exportación? ¿Puede dar un ejemplo de dónde es necesaria la exportación?
barlop
La variable que establece durante una sesión de shell es una variable de shell. es local y accesible a la sesión de shell actual. puede cambiarlo en cualquier momento que desee y su valor actual estará disponible para el proceso de shell actual sin la necesidad de exportar cambios. por otro lado, las variables ambientales se establecen en el momento del inicio de sesión. cuando cambia alguno de sus valores, debe realizar lo que en términos simples sería una actualización para que el nuevo valor esté disponible tanto para el proceso de shell actual como para cualquier proceso hijo nuevo. eso es exactamente lo que hace la exportación.
katwekibs