Para responder às suas perguntas especificamente:
-
export
faz definir$PATH
explicitamente. -
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 deexport
ser executado - o valor do ambiente atual para$PATH
é expandido para a palavra$PATH
. -
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.