Variável de ambiente versus variável de shell, qual é a diferença?

56

Alguém me disse isso:

BASH não é uma variável de ambiente, é uma variável de shell

Qual é a diferença?

Tom Brito
fonte
parece que a mesma coisa só tem um escopo diferente?
Alexander Mills

Respostas:

35

$BASHé uma variável local que é válida apenas no shell atual (bash).

Variáveis ​​de ambiente como $SHELLválidas em todo o sistema. Em um shell Bash atual, $BASHaponta para o caminho de execução do bash , enquanto $SHELLaponta para o shell definido como padrão (que pode ser do mesmo valor).

Para obter uma explicação das variáveis ​​de ambiente, consulte Variáveis ​​de ambiente na Ajuda do Ubuntu.

Takkat
fonte
11
Um ótimo link (+1) :)
Peter.O
12
Esta resposta está incorreta / imprecisa. As variáveis ​​de ambiente NÃO são globais / em todo o sistema. As variáveis ​​do shell são privadas para o shell em execução no momento e NÃO são exportadas (transmitidas) para nenhum processo filho. Variáveis ​​de ambiente são exportadas para qualquer processo filho. "MYVAR = privado; exportar OURVAR = compartilhado; printenv" reportaria apenas "OURVAR" porque quando o shell executa o comando printenv, ele exporta OURVAR, mas não MYVAR.
CM
2
+1 ao comentário de CM! Eu nunca ouvi a diferença explicada de maneira tão simples e precisa !!! Este comentário deve ser a resposta.
Jesse the Wind Wanderer
48

Uma variável de ambiente é uma disponível globalmente em um programa e em programas filhos. Uma variável de shell está disponível apenas no shell atual. Para disponibilizar uma variável de shell como variável de ambiente, use export VARNAME(sem dólar $).

Exemplos para esclarecimento:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Outra maneira de definir uma variável de ambiente:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE
Lekensteyn
fonte
Eu não acho que isso esteja correto. exportnão define necessariamente uma variável de ambiente. stackoverflow.com/questions/7411455/…
Chris Stryczynski 17/17
3
O @ChrisStryczynski exportdefine uma variável de ambiente para processos filhos. A postagem que você vinculou não contradiz esta resposta. Você poderia esclarecer por que acha que está errada?
Lekensteyn
exportabsolutamente definir uma variável de ambiente
David Tonhofer
9

Há uma diferença. Variáveis ​​de Shell e Variáveis ​​de Ambiente explicarão melhor do que eu posso, mas aqui está um trecho:

Se uma alteração for feita em uma variável do shell, ela deverá ser explicitamente "exportada" para a variável de ambiente correspondente para que qualquer subprocesso bifurcado veja a alteração. Lembre-se de que as variáveis ​​do shell são locais no shell em que foram definidas.

Peter.O
fonte
Estou comentando a minha própria resposta .. Eu realmente gosto da Ajuda Ubuntu link na resposta de Takkat ... (é melhor que a minha)
Peter.O
3
Além disso, seu link não funciona mais!
1

Variável do shell: curto prazo, aplicada apenas à instância atual do shell, não aplicável em todo o sistema

Variável ambiental: uso a longo prazo, sistema válido em todo o mundo, permitido globalmente

Por convenção, Shell Variable tem seu nome em minúsculas enquanto Envn. Variáveis ​​são escritas como maiúsculas

Ashish
fonte
-1

Para responder a essa pergunta, primeiro tente entender o escopo de uma variável.

Quando você cria uma nova variável como a SOME_ENV_VARIABLE="testing.txt"que reside em SHELL scope, isso significa que ela pode ser acessada pela instância do shell em que o usuário está logado. Quando a instância muda, por exemplo, você abre um novo terminal ou o shell (por exemplo, você mudar para csh) você não pode acessar essa variável.

Quando você exporta essa variável como export SOME_ENV_VARIABLEessa variável agora está disponível no escopo do ambiente, isso significa que, se você alterar o shell, ainda poderá acessar essa variável. Vamos tentar entender com o seguinte exemplo:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Analogia: suponha que você tenha um apartamento de dois quartos e o compartilhe com outro colega de quarto. A área comum pode ser acessada por qualquer pessoa, exceto seus quartos, a variável de ambiente é como a área comum e a variável shell é como o quarto. Se você quiser algo na área comum, ele pode ser acessado por qualquer pessoa, mas se você a mantiver no quarto, ela poderá ser acessado por você.

Lembre-se, se abrir um novo terminal, você não poderá acessar nenhuma das variáveis ​​porque está alterando essa instância . Para isso, você deve adicionar suas variáveis ​​em um .profileou .bashrc(se estiver usando o bash).

Vishrant
fonte