Configurar PATH versus exportar PATH en ~/.bash_profile

Configurar PATH versus exportar PATH en ~/.bash_profile

¿Cuál es la diferencia y cuál es mejor usar al personalizar mi perfil de bash? La documentación sobre el exportcomando 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 $PATHes la misma que en la versión 1. envtambién es la misma.

Entonces:

  • 1) ¿Cuál es el beneficio de usar exportversus 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:

  1. export haceestablecer el $PATHexplícitamente.

  2. No. exportestablece el entorno para los procesos secundarios, pero $PATHya está configurado para el entorno actual. Entonces, en el segundo ejemplo, cuando se lee el comando, yantes exportse ejecuta: el valor del entorno actual para $PATHse expande a la $PATHpalabra.

  3. 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 elexportincorporadoentonces:

El shell dará el exportatributo 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 exportla 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 exporteditado previamente. Alternativamente, solo puede set -ausar una parte del script y luego set +adesarmarlo; 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

exportNo 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 exporty 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 exportlas 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 ENVarchivos invocados por primera vez por un shell como .bashrco .profileestablecerá valores variables durante la vida de ese shell. Por lo tanto, cualquier variable que se establezca y exportedite dentro de esos archivos mantendrá esa exportcaracterística y se exportenviará 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 bashamplía exportun poco la función incorporada para incluir la -nopción, que le permite eliminar el exportatributo de una variable sin unsetmodificarlo, pero este no es un comportamiento portátil.

Respuesta2

Aquí hay un hilo similar.

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 exportsus 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

información relacionada