Variável do shell vs. variável de ambiente, qual é a preferida se ambos tiverem o mesmo nome?

10

Digitando o seguinte no Bash:

env | grep USER

e

set | grep USER

dá às duas vezes o mesmo nome de usuário.

Como eu sei, por exemplo, ao digitar echo $USERse o shell ou a variável de ambiente foi exibida?

tubarão
fonte

Respostas:

14

Para shells compatíveis com POSIX (incluindo Bash), o padrão diz:

2.5.3 Variáveis ​​Shell As
variáveis ​​devem ser inicializadas a partir do ambiente [...] Se uma variável é inicializada a partir do ambiente, ela deve ser marcada para exportação imediatamente; veja o especial de exportação embutido. Novas variáveis ​​podem ser definidas e inicializadas com atribuições de variáveis, [etc.]

E sobre export:

export name[=word]...
O shell deve atribuir o atributo export às variáveis ​​correspondentes aos nomes especificados, o que fará com que elas estejam no ambiente de comandos executados posteriormente.

Portanto, do ponto de vista do shell, existem apenas variáveis. Alguns deles podem ter vindo do ambiente quando o shell foi iniciado, e alguns deles podem ser exportados para o ambiente dos processos que o shell inicia.

(O "ambiente" é realmente apenas um monte de strings passadas para o processo quando ele é iniciado. Quando o processo está em execução, ele pode fazer o que quiser com isso, usá-lo, ignorá-lo, substituí-lo. E o que um processo passa quando iniciar outros processos pode ser outra coisa, é claro que é comum passar todas as variáveis ​​de ambiente novamente.)


Se você estava usando algum shell não POSIX, como csh, as coisas podem ser diferentes:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
ilkkachu
fonte
1
Observe que o shell Bourne, como o csh, inicializa variáveis ​​de shell a partir de variáveis ​​de ambiente. Mas modificar variáveis ​​de shell não afeta a variável de ambiente correspondente, a menos que você as exporte. Isso foi quebrado pelo shell Korn (e especificado pelo POSIX). É por isso que você deve ter cuidado com o nome das variáveis ​​do shell que usa agora para garantir que não esteja modificando env vars que possam afetar os comandos executados em seu script.
Stéphane Chazelas
4

Essas são a mesma variável. No shell, ao contrário da maioria das outras linguagens de programação, variáveis ​​de ambiente e variáveis ​​de shell compartilham o mesmo espaço de nome. No shell, uma variável de ambiente é uma variável do shell que foi exportada export.

Veja, por exemplo, minha resposta à sua pergunta anterior " Qual é a diferença de uso entre variáveis ​​de shell e variáveis ​​de ambiente? "

Kusalananda
fonte
relendo sua explicação, só preciso aprender algumas coisas antes de poder entender sua resposta.
sharkant
@sharkant Não se preocupe. Se estou confundindo as coisas, diga-me e tentarei esclarecer. A resposta de ilkkachu também é boa.
Kusalananda
não, acho que não, você tem um bom estilo de explicação, é apenas a minha falta de conhecimento que ainda não os pode valorizar.
sharkant
2

A variável Shell pode ser usada apenas para o shell atual, não pode ser usada em todo o sistema. Por outro lado, a variável ambiental pode ser usada em todo o sistema. Por convenção, a variável de shell é gravada em minúscula, enquanto a variável de ambiente é gravada em maiúscula. Você pode fazer uma variável de shell funcionar como uma variável de ambiente, basta exportá-la.

Nazmul Ahmed Noyon
fonte