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

9

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 $USER se o shell ou a variável de ambiente foi exibido?

    
por sharkant 12.05.2017 / 15:39

3 respostas

13

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

2.5.3 Shell Variables
Variables shall be initialized from the environment [...] If a variable is initialized from the environment, it shall be marked for export immediately; see the export special built-in. New variables can be defined and initialized with variable assignments, [etc.]

E sobre export :

export name[=word]...
The shell shall give the export attribute to the variables corresponding to the specified names, which shall cause them to be in the environment of subsequently executed commands.

Então, 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 iniciados pelo shell.

(O "ambiente" é realmente apenas um monte de strings passadas para o processo quando ele é iniciado. Quando o processo está rodando, ele pode fazer o que quiser com isso, usá-lo, ignorá-lo, sobrescrevê-lo. E que processo passa ao iniciar outros processos pode ser outra coisa, embora, é claro, é normal 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
    
por 12.05.2017 / 15:58
4

Estas são a mesma variável. No shell, ao contrário da maioria das outras linguagens de programação, variáveis de ambiente e de shell compartilham o mesmo espaço de nomes. No shell, uma variável de ambiente é uma variável do shell que foi exportada com 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? "

    
por 12.05.2017 / 15:44
2

A variável Shell pode ser usada apenas para o shell atual, não pode ser usada no sistema inteiro. Por outro lado, a variável ambiental pode ser usada em todo o sistema. Por convenção, as Variáveis Shell são escritas em minúsculas enquanto Variáveis Ambientais são escritas em maiúsculas. Você pode fazer uma variável shell funcionar como uma variável de ambiente, você só precisa exportá-la.

    
por 12.05.2017 / 18:53