Configurando PATH versus exportando PATH em ~/.bash_profile

Configurando PATH versus exportando PATH em ~/.bash_profile

Qual é a diferença e qual é melhor usar ao personalizar meu perfil bash? A documentação sobre o exportcomando é escassa, pois é um cmd integrado.

Trecho da versão 1 do meu ~/.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

Saída de:echo $PATH /usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/njboot/bin

Trecho da versão 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

A saída de echo $PATHé a mesma da versão 1. envtambém é a mesma.

Então:

  • 1) Qual é a vantagem de usar exportversus definir PATH explicitamente?
  • 2) Existe alguma diferença funcional entre a versão 1 e a versão 2 quando aplicada?
  • 3) Qual devo usar e por quê?

Responder1

Para responder especificamente às suas perguntas:

  1. export fazdefina $PATHexplicitamente.

  2. Não. exportdefine o ambiente para processos filhos, mas $PATHjá está definido para o ambiente atual. Assim, no segundo exemplo, quando o comando é lido - eantes exporté executado - o valor do ambiente atual para $PATHé expandido para a $PATHpalavra.

  3. Você deve usar o que for necessário e/ou confortável para você. Nenhum dos dois faz qualquer diferença funcionalmente, então isso é principalmente uma questão de estilo.

POSIX define oexportconstruídas ementão:

O shell dará o exportatributo às variáveis ​​correspondentes aos nomes especificados, o que fará com que elas estejam no ambiente dos comandos executados posteriormente. Se o nome de uma variável for seguido por= palavra, então o valor dessa variável deve ser definido comopalavra.

De outro meurespostas:

Há pouca diferença entre declarar uma variável de shell e uma variável de ambiente. Como export é interno, ele declara uma variável de ambiente para o próximo processo invocado, mas se você não invocar um, esse processo permanecerá no shell e, portanto, sua variável será avaliada duas vezes.

Você pode remover todas as exportações sem qualquer efeito nas variáveis ​​exportadas, desde que não exportavalie duas vezes. Por avaliar duas vezes, quero dizer:

var1=var2 
export "${var1}=var3"
echo "$var2"
var3

Em vez disso, basta usar:

set -a 

...no topo do script. Todas as variáveis ​​definidas posteriormente serão automaticamente exported- o que incluiria variáveis ​​que você talvez não tenha exporteditado anteriormente. Alternativamente, você poderia apenas set -apara uma parte do script e posteriormente set +adesmarcá-lo - também poderia funcionar como função.

Mas os subshells herdam automaticamente os valores das variáveis ​​de qualquer maneira, então:

var1=value
( echo "$(echo "$var1")" )
value

exportnão faz diferença nesse caso.

Mas se o seu script chamar outro script ou qualquer outro executável que interprete os valores que você exporteditou e você parar de exportusá-los, esses valores não estarão mais disponíveis em seu ambiente. No exemplo a seguir, uso a variável shell $PS1- que define o conteúdo do prompt de um shell interativo - para demonstrar como as variações nas exportvariáveis ​​ed afetam os processos filhos.

export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

this is another executable
 > exit
exit

Mas ...

PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

sh-4.3$ exit
exit

Mas, novamente, se você declarar explicitamente variáveis ​​de ambiente ao invocar um processo...

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

Qualquer um dos ENVarquivos invocados pela primeira vez por um shell, como .bashrcou, .profiledefinirá valores variáveis ​​durante a vida desse shell. Portanto, quaisquer variáveis ​​definidas e exporteditadas nesses arquivos manterão essa exportcaracterística e serão exportenviadas para todos os processos filhos invocados por esse shell durante a vida útil do shell ou até que sejam unset.

É notável, porém, que bashestende exportum pouco o builtin para incluir a -nopção - que permite remover o exportatributo de uma variável sem unsettingi-lo, mas este não é um comportamento portátil.

Responder2

Aqui está um tópico semelhante.

Uma resposta curta:

https://superuser.com/a/153378/333431

Variáveis ​​exportadas são passadas para processos filhos, variáveis ​​não exportadas não.

Isso significa que você deve usar exportsuas variáveis, se pretende usá-las em subshells.

Você pode testar isso:

$ 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

informação relacionada