Establecer variables de entorno de Linux

9

Estoy ejecutando Red Hat Linux Enterprise 5; Siempre estoy usando el comando de exportación para establecer variables de entorno.

¿Existen otras formas de establecer variables de entorno y cuáles son sus ventajas / desventajas?

George2
fuente

Respuestas:

16

Este es un extracto de la página de manual de Bash:

export [-fn] [nombre [= palabra]] ...
export -p
Los nombres proporcionados están marcados para la exportación automática al entorno de los comandos ejecutados posteriormente. Si se da la opción -f, los nombres se refieren a funciones ...

Si solo necesita la variable en el entorno actual, no es necesario utilizar la exportación.

var=value

Editar:

Sin exportación: solo entorno actual. Con exportación: entorno actual y entornos secundarios.

Aquí hay una demostración del efecto de la exportación en la disponibilidad de una variable en un entorno secundario y que los cambios en el entorno secundario no afectan al principal:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

Después del primer echo ( echo "parent...") verá "123" y "456" porque ambos var1y var2están activos en el entorno actual. No ve un valor var3porque todavía no está configurado.

Después de la línea que comienza " var3=..." no ve un valor var1porque no se exportó. Usted lo hace ver un valor para var2, ya que se exporta. Ves un valor para var3, ya que se fijó para el medio ambiente del niño solamente .

( bash -ces equivalente a ejecutar un script con el contenido del argumento de la -copción. Un script u otro ejecutable o, en este caso, el argumento se bash -cconvierte en un elemento secundario del entorno actual que, como resultado, es, por supuesto, el elemento secundario del niño padre.)

En el "script" se cambian los valores de la variable. Ahora genera esos nuevos valores.

Una vez que finaliza el "script", la ejecución vuelve al entorno principal (la línea de comando en este caso). Después del último eco, verá los valores originales porque los cambios realizados en el entorno secundario no afectan al primario.

Pausado hasta nuevo aviso.
fuente
¿Qué significa "en el entorno actual"? Script actual de bash o?
George2
1
Sí, significa "en el script actual" o "en la sesión interactiva actual". Eso excluye los ejecutables o los scripts que se ejecutan desde el script actual o la sesión interactiva. Ese es el propósito de export: hacer que las variables estén disponibles para estos entornos secundarios.
Pausado hasta nuevo aviso.
Encuentro algunos conflictos por lo que dijiste. :-) Usted dijo "Para que eso excluya ejecutables o scripts", preste atención a "excluir", pero en lo que citó, mencionó "Los nombres suministrados están marcados para la exportación automática al entorno de comandos ejecutados posteriormente". - se debe "incluir" (exportación automática a, o impacto), y no "excluir". Estoy confundido, ¿podrías aclarar por favor?
George2
1
@ George2: Vea mi respuesta editada para más información.
Pausado hasta nuevo aviso.
3

Tu dices eso

Siempre estoy usando el comando de exportación para establecer la variable de entorno

Por cierto, parece que realmente estás tratando de preguntarte cómo haces que una variable ambiental persista. Hacer eso requeriría que coloque su export VAR="foo"estado de cuenta en su archivo $ HOME / .bash_profile (si está usando bash). Si desea que esa variable de entorno persista para todos los usuarios excepto root, agréguela a / etc / profile. Si desea que también se agregue para el usuario root, configúrelo en /root/.bash_profile.

Esto funcionará para todos los shells de inicio de sesión donde bash es el shell de elección. Para shells que no son de inicio de sesión, debe usar .bashrc. No tengo ideas para ofrecer otros proyectiles: D

whaley
fuente
2
Es posible que desee volver a leer la sección de la página de manual de Bash sobre cuándo se obtienen esos archivos.
Pausado hasta nuevo aviso.
1
Sí ... Tengo un inicio de sesión e interactivo confundido. Editando mi respuesta para reflexionar. ¡Gracias por la corrección!
Whaley
"hacer que una variable ambiental persista": ¿qué significa persistir?
George2
1
"Persistir" significa que desea que esta variable tenga este valor cada vez que se inicia un shell. Puede o no ser necesario exportar la variable dependiendo de cuál sea su propósito.
Pausado hasta nuevo aviso.
1
Eso significa que no lo has hecho persistente. Intenta hacer lo que describió Whaley .
Pausado hasta nuevo aviso.
1

exportar es la forma más sencilla de hacerlo, entonces, ¿por qué no dejarlo así?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells
BloodPhilia
fuente
2
Bourne shell requiere VARIABLE = valor; export VARIABLE
mpez0
1
Esto debería funcionar también ...
BloodPhilia
@BloodPhilia, para bash, ¿solo una forma de establecer la variable de entorno?
George2
1
@ George2: cuando se utiliza VARIABLE = value, se crea una variable local que desaparece después de la ejecución actual del script. Cuando se utiliza la exportación, los procesos secundarios heredan los valores variables de su proceso primario. Por ejemplo: FOO=BAR; executethisprogram El programa executethisprogramNO SABERÁ el valor de la variable FOO. Por otro lado, cuando se usa: FOO=BAR; export FOO; executethisprogram El programa executethisprogramSABERÁ el valor de la variable FOO.
BloodPhilia
1
ejecutar este programa no es un subproceso de "exportar FOO". Es un subproceso (secundario) del script que lo llama o el shell interactivo (línea de comandos). export FOOes un comando que marca la variable FOOpara que puedan acceder a ella los procesos secundarios del entorno en el que se emitió el comando. Ese padre puede ser un script o un shell interactivo.
Pausado hasta nuevo aviso.
1

También puedes hacer algo como esto:

VAR=val application

Por ejemplo:

LANG=C ls --help

salida en ingles.

LANG=pl_PL ls --help

salida en polaco (si está disponible).

En el pasado en sh no podías exportar VAL = val. Usted tenia que

VAL=val; export VAL
gogiel
fuente
Estoy confundido acerca de "VAR = aplicación val", ¿qué significa val y qué significa aplicación?
George2
2
Estos ejemplos establecen el valor de la variable para el entorno secundario ( lspor ejemplo) sin afectar el valor de esa variable en el entorno actual (principal).
Pausado hasta nuevo aviso.
¿Es el entorno infantil de qué? Estoy confundido.
George2
1
lses un elemento secundario del proceso desde el que se ejecutó. Si escribo lsen el símbolo del sistema, el shell interactivo es el padre y lsel hijo. Si tengo un script que usa, lsentonces el script es el padre y lsel hijo.
Pausado hasta nuevo aviso.