Configurando o PATH vs. exportando o PATH em ~ / .bash_profile [duplicado]

16

Qual é a diferença e qual é melhor usar ao personalizar meu perfil bash? Documentação sobre o comando export é escassa, já que é um cmd embutido.

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 é igual à da versão 1. env é o mesmo também.

Então:

  • 1) Qual é o benefício de usar export versus definir o 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ê?
por njboot 22.06.2014 / 02:58

2 respostas

12

Para responder às suas perguntas especificamente:

  1. export faz definir $PATH explicitamente.

  2. Não. export define ambiente para processos filhos, mas $PATH já está definido para o ambiente atual. Assim, no segundo exemplo, quando o comando é lido - e antes de export ser executado - o valor do ambiente atual para $PATH é expandido para a palavra $PATH .

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

POSIX define o export builtin então:

The shell shall give the export attribute to the variables corresponding to the specified names, which shall cause them to be in the environment of subsequently executed commands. If the name of a variable is followed by = word, then the value of that variable shall be set to word.

De outra das minhas respostas :

Há pouca diferença entre declarar uma variável de shell e uma variável de ambiente. Como a exportação é embutida, ela declara uma variável de ambiente para o próximo processo chamado, mas se você não invocar uma, 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 você não use export para avaliar duas vezes. Por duas vezes avaliar quero dizer:

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

Em vez disso, use:

set -a 

... no topo do script. Todas as variáveis definidas a partir de então serão automaticamente exported - o que incluiria variáveis que você talvez não tenha anteriormente export ed. Alternativamente, você poderia apenas set -a para uma parte do script e, posteriormente, set +a para desfazer a configuração - também poderia funcionar como função.

Mas os subshells herdam automaticamente os valores das variáveis, portanto:

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

export não faz diferença nesse caso.

Mas se o script chamar outro script, ou qualquer outro executável que interprete valores que você tenha export ed e você deixar de export , esses valores não estarão mais disponíveis em seu ambiente. No exemplo a seguir, eu uso a variável de shell $PS1 - que define o conteúdo de um prompt do shell interativo - para demonstrar como as variações nas variáveis export 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 arquivos ENV chamados pela primeira vez por um shell, como .bashrc ou .profile , definirá valores de variáveis para a vida útil desse shell. Portanto, quaisquer variáveis que estejam definidas e export ed nesses arquivos manterão essa característica de export e serão export ed para todos os processos filhos invocados por esse shell durante a vida útil do shell ou até que sejam unset .

No entanto, é notável que bash estenda o export incorporado para incluir a opção -n - que permite remover o atributo export de uma variável sem unset , mas isso não é um comportamento portátil.

    
por 22.06.2014 / 17:45
9

Aqui está um tópico semelhante .

Uma resposta curta:

link

Exported variables get passed on to child processes, not-exported variables do not.

Isso significa que você deve export de suas variáveis, se você 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
    
por 22.06.2014 / 03:05