Configurando variáveis ​​de ambiente Linux

9

Estou executando o Red Hat Linux Enterprise 5; Estou sempre usando o comando export para definir variáveis ​​de ambiente.

Existem outras maneiras de definir variáveis ​​de ambiente e quais são as vantagens / desvantagens delas?

George2
fonte

Respostas:

16

Este é um trecho da página de manual do Bash:

exportar [-fn] [nome [= palavra]] ...
exportar -p
Os nomes fornecidos são marcados para exportação automática para o ambiente de comandos executados posteriormente. Se a opção -f for fornecida, os nomes se referem às funções ...

Se você precisar apenas da variável no ambiente atual, não será necessário usar a exportação.

var=value

Editar:

Sem exportação: apenas ambiente atual. Com exportação: ambiente atual e ambientes filho.

Aqui está uma demonstração do efeito da exportação na disponibilidade de uma variável em um ambiente filho e que as mudanças no ambiente filho não afetam o pai:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

Após o primeiro eco ( echo "parent..."), você vê "123" e "456" porque ambos var1e var2estão ativos no ambiente atual. Você não vê um valor para var3porque ainda não está definido.

Após a linha que " var3=..." inicia, você não vê um valor var1porque não foi exportado. Você fazer ver um valor para o var2porque ele foi exportado. Você vê um valor para var3porque ele foi criado para o ambiente criança única .

( bash -cé equivalente a executar um script com o conteúdo do argumento para a -copção. Um script ou outro executável ou, nesse caso, o argumento para bash -cse tornar filho do ambiente atual que, como resultado, é claro, o filho da criança pai.)

No "script" os valores da variável são alterados. Agora ele gera esses novos valores.

Depois que o "script" é concluído, a execução retorna ao ambiente pai (a linha de comando neste caso). Após o último eco, você vê os valores originais porque as alterações feitas no ambiente filho não afetam o pai.

Dennis Williamson
fonte
O que significa "no ambiente atual"? Script bash atual ou?
quer
11
Sim, significa "no script atual" ou "na sessão interativa atual". Isso exclui os executáveis ​​ou scripts executados no script atual ou na sessão interativa. Esse é o objetivo de export- disponibilizar variáveis ​​para esses ambientes filho.
Dennis Williamson
Encontro alguns conflitos pelo que você disse. :-) Você disse "De modo que exclui executáveis ​​ou scripts", preste atenção a "excluir", mas no que você citou, você mencionou "Os nomes fornecidos estão marcados para exportação automática para o ambiente de comandos executados posteriormente". - deve ser "incluído" (exportado automaticamente ou impactado) e não "excluído". Estou confuso, você poderia esclarecer por favor?
quer
11
@ George2: Veja minha resposta editada para mais informações.
Dennis Williamson
3

Você diz que

Estou sempre usando o comando export para definir a variável de ambiente

Pela maneira como você escreveu isso, parece que você está realmente tentando perguntar como você faz uma variável ambiental persistir. Para isso, é necessário que você coloque sua export VAR="foo"declaração no arquivo $ HOME / .bash_profile (se estiver usando o bash). Se você deseja que essa variável ambiental persista para todos os usuários, exceto o root, adicione-a ao / etc / profile. Se você desejar que ele seja adicionado também ao usuário root, defina-o em /root/.bash_profile.

Isso funcionará para todos os shells de logon em que o bash é o shell de escolha. Para shells sem login, você precisa usar .bashrc. Não tenho idéias a oferecer para outras conchas: D

baleia
fonte
2
Você pode reler a seção da página de manual do Bash sobre quando esses arquivos são originados.
Dennis Williamson
11
Sim ... Eu tenho login e interativo confuso. Editando minha resposta para refletir. Obrigado pela correção!
Whaley
"fazer uma variável ambiental persistir" - o que significa persistir?
quer
11
"Persistir" significa que você deseja que essa variável tenha esse valor sempre que um shell for iniciado. Pode ou não ser necessário exportar a variável, dependendo da sua finalidade.
Dennis Williamson
11
Isso significa que você não a tornou persistente. Tente fazer o que whaley descreveu.
Dennis Williamson
1

a exportação é a maneira mais direta de fazer isso, então por que não deixar por isso mesmo?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells
BloodPhilia
fonte
2
O shell Bourne requer VARIABLE = value; exportar VARIABLE
mpez0
11
Isso deve funcionar também ...
BloodPhilia
@BloodPhilia, para o bash, apenas uma maneira de definir variáveis ​​de ambiente?
quer
11
@ George2 - Ao usar VARIABLE = value, você está criando uma variável local que desapareceu após a execução atual do script. Ao usar a exportação, os processos filhos herdam os valores das variáveis ​​do processo pai. Por exemplo: FOO=BAR; executethisprogram O programa executethisprogramNÃO saberá o valor da variável FOO. Por outro lado, ao usar: FOO=BAR; export FOO; executethisprogram O programa executethisprogramsaberá o valor da variável FOO.
BloodPhilia
11
executeethisprogram não é um subprocesso de "export FOO". É um subprocesso (filho) do script que o chama ou o shell interativo (linha de comando). export FOOé um comando que marca a variável FOOpara que ela possa ser acessada por processos filhos do ambiente em que o comando foi emitido. Esse pai pode ser um script ou um shell interativo.
Dennis Williamson
1

Você também pode fazer algo assim:

VAR=val application

Por exemplo:

LANG=C ls --help

saída em inglês.

LANG=pl_PL ls --help

saída em polonês (se disponível).

No passado, em sh, você não podia exportar VAL = val. Você tinha que

VAL=val; export VAL
gogiel
fonte
Estou confuso sobre "VAR = aplicação val", o que significa val e o que significa aplicação?
quer
2
Esses exemplos configuram o valor da variável para o ambiente filho ( lspor exemplo) sem afetar o valor dessa variável no ambiente atual (pai).
Dennis Williamson
É o ambiente infantil de quê? Estou confuso.
quer
11
lsé um filho do processo a partir do qual foi executado. Se eu digitar lsem um prompt de comando, o shell interativo é o pai e lso filho. Se eu tiver um script que use ls, o script será o pai e lso filho.
Dennis Williamson