Variaveis de Ambiente do Shell: export, env, .bashrc, .bash_profile

Variaveis de Ambiente do Shell: export, env, .bashrc, .bash_profile

O Que Voce Vai Conquistar

  • Explicar variaveis de shell vs variaveis de ambiente sob a perspectiva de heranca de processos filhos
  • Entender precisamente por que o export e necessario
  • Explicar a ordem de carregamento dos arquivos de inicializacao para shells de login e nao-login
  • Usar .bashrc e .bash_profile corretamente para seus propositos
  • Diagnosticar por que alteracoes de configuracao nao estao sendo aplicadas

Este e o nucleo do objetivo 105.1 do LPIC-1 "Personalizar e usar o ambiente de shell". Os pontos-chave sao o modelo de heranca de variaveis de ambiente e a ordem de carregamento dos arquivos de inicializacao.

Decidindo Entre Variaveis de Shell e de Ambiente

Aspecto Variavel de shell Variavel de ambiente
Como definir VAR=value export VAR=value
Herdada por filhos Nao Sim
Listar set env / printenv
Uso Valor temporario dentro do shell atual Config passada a filhos (ex: PATH)

Se voce precisa passar um valor para um processo filho (um comando ou script que voce executa), transforme-o em variavel de ambiente com export. Para um calculo temporario apenas dentro do shell, uma variavel de shell e suficiente.

Ordem de Carregamento dos Arquivos de Inicializacao

Tipo de shell Arquivos carregados
Shell de login /etc/profile -> ~/.bash_profile (ou ~/.bash_login -> ~/.profile)
Shell interativo nao-login /etc/bash.bashrc -> ~/.bashrc
Shell nao-interativo (script) O arquivo apontado por $BASH_ENV (geralmente nenhum)

Por convencao, ~/.bash_profile faz source do ~/.bashrc para que a configuracao fique consolidada em ~/.bashrc. Sem saber disso, voce nao consegue explicar "aplica no login SSH mas nao ao abrir um terminal (ou vice-versa)".

Passos

Passo 1: Definir uma variavel de shell e verificar a heranca

MYVAR=hello
echo $MYVAR
bash -c 'echo "child sees: $MYVAR"'
hello
child sees:

MYVAR e uma variavel de shell, portanto nao e herdada pelo processo filho (bash -c) e fica vazia. Essa e a diferenca decisiva em relacao a uma variavel de ambiente.

Passo 2: Promover a variavel de ambiente com export

export MYVAR
bash -c 'echo "child sees: $MYVAR"'
export GREETING=hi
env | grep GREETING
child sees: hello
GREETING=hi

Promover uma variavel de shell a variavel de ambiente com export faz com que ela seja herdada pelos filhos. export VAR=value define e promove de uma so vez.

Passo 3: Verificar a lista de variaveis

set | grep MYVAR
env | grep MYVAR
printenv PATH
MYVAR=hello
MYVAR=hello
/usr/local/bin:/usr/bin:/bin

set mostra todas as variaveis incluindo as de shell, enquanto env (printenv) mostra apenas as de ambiente. Aparecer em ambos significa que foi exportada; aparecer apenas em set significa que ainda e uma variavel de shell.

Passo 4: Editar um arquivo de inicializacao e aplica-lo

echo 'export EDITOR=vim' >> ~/.bashrc
echo "alias ll='ls -alF'" >> ~/.bashrc
source ~/.bashrc
echo $EDITOR
vim

Adicoes ao .bashrc so entram em vigor a partir de um novo shell. Para aplicar imediatamente no shell atual, execute source ~/.bashrc (equivalente a . ~/.bashrc).

Passo 5: Remover variaveis

unset MYVAR
echo "[$MYVAR]"
unalias ll
[]

unset remove uma variavel. Aliases sao removidos com unalias. Para executar um comando temporariamente sem uma variavel de ambiente, voce tambem pode usar env -u VAR command.

Por Que o export e Necessario

Processos Linux criam filhos via fork + exec. Nesse momento, apenas o "ambiente" do processo pai e copiado para o filho; variaveis de shell nao sao passadas para o espaco de memoria do filho. O export atribui a uma variavel o atributo "exportar como ambiente", fazendo com que ela faca parte do ambiente do filho no momento do exec.

PATH e LANG sao validos nos filhos porque ja sao variaveis de ambiente exportadas no login. Por outro lado, uma variavel de shell nao exportada nao pode ser referenciada a partir de um script porque o script e lancado como processo filho e herda o ambiente segundo esse modelo. A heranca e unidirecional pai->filho; uma variavel de ambiente alterada no filho nunca propaga de volta ao pai.

Solucao de Problemas

Sintoma: Alteracoes no .bashrc nao sao aplicadas no login SSH

Causa: O login SSH e um shell de login, entao ~/.bash_profile e lido, nao ~/.bashrc

Verificacao:

grep bashrc ~/.bash_profile

Correcao: Adicione [ -f ~/.bashrc ] && . ~/.bashrc ao ~/.bash_profile e consolide a configuracao em ~/.bashrc.

Sintoma: Uma variavel nao e visivel a partir de um script

Causa: Ainda e uma variavel de shell e nao foi exportada

Verificacao:

export -p | grep VAR

Correcao: Promova variaveis passadas a um filho (script) a variaveis de ambiente com export VAR.

Sintoma: Uma variavel nao e aplicada sem source

Causa: Uma adicao ao arquivo de inicializacao so entra em vigor a partir de um novo shell

Verificacao:

echo $EDITOR

Correcao: Para aplicar imediatamente no shell atual, execute source ~/.bashrc. Tambem sera aplicado ao abrir um novo terminal.

Lista de Verificacao

  • [ ] Confirmou que variaveis de shell nao sao herdadas por processos filhos
  • [ ] Confirmou a heranca pelos filhos apos export
  • [ ] Confirmou a diferenca de exibicao entre set e env
  • [ ] Editou .bashrc e aplicou imediatamente com source
  • [ ] Removeu uma variavel com unset

Resumo

Cenario Comando Finalidade
Variavel de shell VAR=value Valor temporario dentro do shell atual
Promover export VAR Herdar para filhos
Listar (ambiente) env / printenv Inspecionar variaveis de ambiente
Listar (todas) set Inclui variaveis de shell
Aplicar agora source ~/.bashrc Recarregar arquivo de inicializacao

O modelo de variaveis de ambiente esta diretamente ligado a compreensao da heranca de processos. Em seguida, avance para o controle de prioridade de processos para conectar o conhecimento operacional.

Proximas Leituras

Continue Sua Jornada LPIC-1

Hub LPIC-1

  • Hub de Aprendizado LPIC-1 -- Mapa completo de artigos LPIC-1, acompanhamento de progresso e cobertura dos objetivos do exame

Artigos LPIC-1 Relacionados

Pratica