Qual é a diferença e qual é melhor usar ao personalizar meu perfil bash? A documentação sobre o export
comando é 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. env
também é a mesma.
Então:
- 1) Qual é a vantagem de usar
export
versus 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:
export
fazdefina$PATH
explicitamente.Não.
export
define o ambiente para processos filhos, mas$PATH
já está definido para o ambiente atual. Assim, no segundo exemplo, quando o comando é lido - eantesexport
é executado - o valor do ambiente atual para$PATH
é expandido para a$PATH
palavra.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 oexport
construídas ementão:
O shell dará o
export
atributo à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 export
avalie 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 export
editado anteriormente. Alternativamente, você poderia apenas set -a
para uma parte do script e posteriormente set +a
desmarcá-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
export
nã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ê export
editou e você parar de export
usá-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 export
variá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 ENV
arquivos invocados pela primeira vez por um shell, como .bashrc
ou, .profile
definirá valores variáveis durante a vida desse shell. Portanto, quaisquer variáveis definidas e export
editadas nesses arquivos manterão essa export
característica e serão export
enviadas 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 bash
estende export
um pouco o builtin para incluir a -n
opção - que permite remover o export
atributo de uma variável sem unset
tingi-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 export
suas 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