¿Cuál es la diferencia y cuál es mejor usar al personalizar mi perfil de bash? La documentación sobre el export
comando es escasa, ya que es un cmd integrado.
Extracto de la versión 1 de mi ~/.bash_profile:
#PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin
#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH
Salida de:echo $PATH
/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/njboot/bin
Extracto de la versión 2:
#PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin
#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH
La salida de echo $PATH
es la misma que en la versión 1. env
también es la misma.
Entonces:
- 1) ¿Cuál es el beneficio de usar
export
versus configurar PATH explícitamente? - 2) ¿Existe alguna diferencia funcional entre la versión 1 y la versión 2 cuando se aplica?
- 3) ¿Cuál debo usar y por qué?
Respuesta1
Para responder a sus preguntas específicamente:
export
haceestablecer el$PATH
explícitamente.No.
export
establece el entorno para los procesos secundarios, pero$PATH
ya está configurado para el entorno actual. Entonces, en el segundo ejemplo, cuando se lee el comando, yantesexport
se ejecuta: el valor del entorno actual para$PATH
se expande a la$PATH
palabra.Debes utilizar el que sea necesario y/o cómodo para ti. Ninguno de los dos supone ninguna diferencia funcional, por lo que se trata principalmente de una cuestión de estilo.
POSIX define elexport
incorporadoentonces:
El shell dará el
export
atributo 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, entonces el valor de esa variable se establecerá enpalabra.
De otro de misrespuestas:
Hay poca diferencia entre declarar una variable de shell y una variable de entorno. Debido a que la exportación es una función incorporada, declara una variable de entorno para el proceso que se invoca a continuación, pero si no invoca uno, ese proceso sigue siendo el shell, por lo que su variable se evalúa dos veces.
Puede eliminar todas las exportaciones sin ningún efecto en las variables exportadas, siempre y cuando no utilice export
la evaluación dos veces. Por evaluar dos veces quiero decir:
var1=var2
export "${var1}=var3"
echo "$var2"
var3
En su lugar, simplemente use:
set -a
...en la parte superior del guión. Todas las variables definidas a partir de entonces serán automáticas exported
, lo que incluiría variables que quizás no haya export
editado previamente. Alternativamente, solo puede set -a
usar una parte del script y luego set +a
desarmarlo; también podría funcionar como función.
Pero los subniveles heredan automáticamente valores de variables de todos modos, por lo que:
var1=value
( echo "$(echo "$var1")" )
value
export
No hace ninguna diferencia en ese caso.
Pero si su secuencia de comandos llama a otra secuencia de comandos, o cualquier otro ejecutable que interprete los valores que ha editado export
y deja de utilizarlos export
, entonces esos valores ya no estarán disponibles en su entorno. En el siguiente ejemplo, utilizo la variable de shell $PS1
, que define el contenido de un mensaje de shell interactivo, para demostrar cómo las variaciones en export
las variables ed afectan los procesos secundarios.
export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i
###OUTPUT###
this is another executable
> exit
exit
Pero ...
PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i
###OUTPUT###
sh-4.3$ exit
exit
Pero, de nuevo, si declaras explícitamente variables de entorno mientras invocas un proceso...
PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}
###OUTPUT###
this is another executable
> exit
exit
sh-4.3$ exit
exit
Cualquiera de los ENV
archivos invocados por primera vez por un shell como .bashrc
o .profile
establecerá valores variables durante la vida de ese shell. Por lo tanto, cualquier variable que se establezca y export
edite dentro de esos archivos mantendrá esa export
característica y se export
enviará a todos los procesos secundarios invocados por ese shell durante la vida útil del shell o hasta que lo sean unset
.
Es notable, sin embargo, que bash
amplía export
un poco la función incorporada para incluir la -n
opción, que le permite eliminar el export
atributo de una variable sin unset
modificarlo, pero este no es un comportamiento portátil.
Respuesta2
Una respuesta corta:
https://superuser.com/a/153378/333431
Las variables exportadas se pasan a procesos secundarios, las variables no exportadas no.
Esto significa que debe usar export
sus variables, si tiene la intención de usarlas en subcapas.
Puedes probar esto:
$ TEST="im_not_here"
$ echo $TEST
im_not_here
$ bash -c 'echo $TEST'
<empty output>
$ export TEST2="im_here"
$ echo $TEST2
im_here
$ bash -c 'echo $TEST2'
im_here