O que a exportação faz no BASH? [duplicado]

75

Possível duplicado:
diferença entre "a = b" e "exportar a = b" no bash

É difícil admitir, mas eu nunca entendi o que exatamente exportfaz com uma variável de ambiente. Eu sei que, se eu não exportar uma variável, às vezes não a vejo em processos filhos, mas às vezes parece que posso. O que realmente está acontecendo quando digo

export foo=5

e quando não devo exportar uma variável?

Chas. Owens
fonte
Aqui está um link para pelo menos mais uma pergunta útil sobre esse tópico: superuser.com/questions/143413/linux-environment-variables ... pois, ironicamente, essa pergunta foi a primeira que apareceu no Google para minha consulta de exportação no bash .
Ogre Psalm33
11
Também: superuser.com/questions/18988/...
Ogre Psalm33
Um uso comum é adicionar exportinstruções ao .bashrc / .bash_profile para criar variáveis ​​globais persistentes semelhantes a $HOME.
Evan Solha
Cuidado, há mais nessa história do que parece inicialmente. Convido você a verificar minha resposta.
jasonleonhard

Respostas:

15

De man bash:

MEIO AMBIENTE

Quando um programa é chamado, é fornecida uma matriz de cadeias chamada ambiente. Esta é uma lista de pares nome-valor, no formato nome = valor.

O shell fornece várias maneiras de manipular o ambiente. Na chamada, o shell varre seu próprio ambiente e cria um parâmetro para cada nome encontrado, marcando-o automaticamente para exportação para processos filho. Os comandos executados herdam o ambiente. Os comandos export e declare -xpermitem que parâmetros e funções sejam adicionados e excluídos do ambiente. Se o valor de um parâmetro no ambiente for modificado, o novo valor se tornará parte do ambiente, substituindo o antigo. O ambiente herdado por qualquer comando executado consiste no ambiente inicial do shell, cujos valores podem ser modificados no shell, menos os pares removidos pelo unset comando, além de quaisquer adições por meio da exportação e dos declare -xcomandos.

sml
fonte
74
A cópia e colagem do IMHO de um trecho da documentação sem nenhum esforço adicional de explicação não deve ser aprovada.
Artur
30
Esse trecho não é muito claro e, francamente, não entendi o que está acontecendo.
precisa
4
@ Artur: pelo contrário: se a documentação (trecho da) responder a uma pergunta, prefiro não ter explicações adicionais.
René Nyffenegger 10/10
11
@ RenéNyffenegger, mas parece que não. Pelo menos, não entendi até ler uma resposta de BloodPhilia que deveria ser marcada como aceita.
Vladislav Rastrusny
11
Acredito que os argumentos de Artur e Trismegistos são: qualquer um pode copiar e colar, nem sempre é suficiente, esclarecer e fornecer uma boa resposta. Não há problema em copiar e colar alguma documentação ou fornecer um link; na verdade, isso é incentivado, mas deve haver alguma explicação adicional de qualidade. Além disso, essa explicação pode ser facilmente ignorada por pessoas como RenéNyffenegger, caso não precisem, mas estará lá para quem se beneficiará. Estamos todos tentando aprender e temos maneiras diferentes de obter entendimento. Isso ajuda a abranger uma variedade de estilos de aprendizado e melhorará sua classificação.
jasonleonhard
99

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

BloodPhilia
fonte
Você pode apontar para qualquer documentação para esse efeito. Estou procurando mais informações do que isso. Por exemplo, uma variável precisa ser exportada apenas uma vez ou é necessário exportá-la após cada alteração, etc.
Chas. Owens
11
Você pode verificar isso: superuser.com/questions/143413/linux-environment-variables/…
BloodPhilia
3
Você pode verificar isso, adicionando algo para um caminho (dizer a PYTHONPATH) e, em seguida, observando que embora você pode echo $PYTHONPATHnão ser reconhecido pelo Python ou festança roteiros até exportele
Kaushik Ghose
Esta resposta também não parece ser totalmente verdadeira. As subcascas Bash, por exemplo, são para processos filhos (de acordo com $BASHPID) e, no entanto, você pode ler variáveis ​​não exportadas no shell pai. Prova simples: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") Meu palpite é que este é um caso especial que ocorre quando o processo filho é um subcasca.
JepZ
20

Ao usar export, você está adicionando a variável à lista de variáveis ​​de ambiente do shell na qual o comando export foi chamado e todas as variáveis ​​de ambiente de um shell são passadas para os processos filhos, é por isso que você pode usá-lo.

Quando você termina o shell, seu ambiente é destruído, é por isso que as variáveis ​​de ambiente são declaradas e exportadas no login, no arquivo .bashrc, por exemplo

alfredozn
fonte