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?


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


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.


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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.