Diferença entre "a = b" e "exportar a = b" no bash

50

Qual é a diferença entre:

a=b

e

export a=b

Na festança?

Entendo que os dois definem variáveis ​​de ambiente, mas não entendo completamente a diferença.

Adam Matan
fonte
Alguém poderia editar isso? Isso não está relacionado ao Linux, mas depende apenas do shell que você está usando. Eu acho que é bash aqui, que também funciona no Windows.
innaM
Eu estou corrigido.
468 Adam Matan

Respostas:

54

export propaga a variável para subprocessos.

Por exemplo, se você fez

FOO=bar

então um subprocesso que verificava FOO não encontraria a variável, enquanto

export FOO=bar

permitiria ao subprocesso encontrá-lo.

Mas se FOOtenha sido definida como uma variável de ambiente, em seguida, FOO=barirá modificar o valor dessa variável de ambiente.

Por exemplo:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Os shells mais antigos não suportavam a export FOO=barsintaxe; você teve que escrever FOO=bar; export FOO.

Mike McQuaid
fonte
33
Na verdade, se você não usar " export", não está definindo uma variável de ambiente, mas apenas uma variável de shell. As variáveis ​​do shell estão disponíveis apenas para o processo do shell; variáveis ​​de ambiente estão disponíveis para qualquer processo subsequente, não apenas shells. Além disso, subshells são comandos contidos entre parênteses, que têm acesso a variáveis ​​de shell, enquanto o que você está falando são processos filhos que são shells.
Wfaulk 28/09/09
Onde eles são armazenados?
HDave
28

Se você não usa export, não está definindo uma variável de ambiente; apenas uma variável shell.

As variáveis ​​do shell estão disponíveis apenas para o processo do shell; variáveis ​​de ambiente estão disponíveis para qualquer processo subsequente, não apenas shells.

wfaulk
fonte
2

Além disso, se você deseja ter a variável disponível para o shell de chamada sem usar a exportação, você pode fazer isso:

O arquivo a.ksh é -

#!/bin/ksh
FOO=bar

No prompt, execute isto é

> . a.ksh

Isso executará os comandos no mesmo shell e o $ FOO estará disponível.

Enquanto que,

> a.ksh

Disponibilizará o $ FOO apenas dentro de a.ksh, após a chamada para a.ksh, ele não existiria.

alok
fonte
1
Corrigir. Observe que "." é apenas um atalho para "fonte", que às vezes é usado em scripts para melhor legibilidade. Veja "ajuda". ou "fonte de ajuda" para obter detalhes.
21810 sleske
1

Além do que já foi respondido, ambas as afirmações não definem necessariamente (ou seja, criar vs definir) uma variável de ambiente como "a" já pode existir como uma variável de ambiente ou shell.

No último caso, ambas as declarações são estritamente equivalentes.

jlliagre
fonte