Variáveis de Ambiente do Shell: export, env, .bashrc, .bash_profile

Variáveis de Ambiente do Shell: export, env, .bashrc, .bash_profile

O Que Você Vai Conquistar

  • Explicar variáveis de shell vs variáveis de ambiente sob a perspectiva de herança de processos filhos
  • Entender precisamente por que o export é necessário
  • Explicar a ordem de carregamento dos arquivos de inicialização para shells de login e não-login
  • Usar .bashrc e .bash_profile corretamente para seus propósitos
  • Diagnosticar por que alterações de configuração não estão sendo aplicadas

Este é o núcleo do objetivo 105.1 do LPIC-1 "Personalizar e usar o ambiente de shell". Os pontos-chave são o modelo de herança de variáveis de ambiente e a ordem de carregamento dos arquivos de inicialização.

Decidindo Entre Variáveis de Shell e de Ambiente

Aspecto Variável de shell Variável de ambiente
Como definir VAR=value export VAR=value
Herdada por filhos Não Sim
Listar set env / printenv
Uso Valor temporário dentro do shell atual Config passada a filhos (ex: PATH)

Se você precisa passar um valor para um processo filho (um comando ou script que você executa), transforme-o em variável de ambiente com export. Para um cálculo temporário apenas dentro do shell, uma variável de shell é suficiente.

Ordem de Carregamento dos Arquivos de Inicialização

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

Por convenção, ~/.bash_profile faz source do ~/.bashrc para que a configuração fique consolidada em ~/.bashrc. Sem saber disso, você não consegue explicar "aplica no login SSH mas não ao abrir um terminal (ou vice-versa)".

Passos

Passo 1: Definir uma variável de shell e verificar a herança

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

MYVAR é uma variável de shell, portanto não é herdada pelo processo filho (bash -c) e fica vazia. Essa é a diferença decisiva em relação a uma variável de ambiente.

Passo 2: Promover a variável 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 variável de shell a variável de ambiente com export faz com que ela seja herdada pelos filhos. export VAR=value define e promove de uma só vez.

Passo 3: Verificar a lista de variáveis

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

set mostra todas as variáveis 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 é uma variável de shell.

Passo 4: Editar um arquivo de inicialização e aplicá-lo

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

Adições ao .bashrc só entram em vigor a partir de um novo shell. Para aplicar imediatamente no shell atual, execute source ~/.bashrc (equivalente a . ~/.bashrc).

Passo 5: Remover variáveis

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

unset remove uma variável. Aliases são removidos com unalias. Para executar um comando temporariamente sem uma variável de ambiente, você também pode usar env -u VAR command.

Por Que o export é Necessário

Processos Linux criam filhos via fork + exec. Nesse momento, apenas o "ambiente" do processo pai é copiado para o filho; variáveis de shell não são passadas para o espaço de memória do filho. O export atribui a uma variável o atributo "exportar como ambiente", fazendo com que ela faça parte do ambiente do filho no momento do exec.

PATH e LANG são válidos nos filhos porque já são variáveis de ambiente exportadas no login. Por outro lado, uma variável de shell não exportada não pode ser referenciada a partir de um script porque o script é lançado como processo filho e herda o ambiente segundo esse modelo. A herança é unidirecional pai->filho; uma variável de ambiente alterada no filho nunca propaga de volta ao pai.

Solução de Problemas

Sintoma: Alterações no .bashrc não são aplicadas no login SSH

Causa: O login SSH é um shell de login, então ~/.bash_profile é lido, não ~/.bashrc

Verificação:

grep bashrc ~/.bash_profile

Correção: Adicione [ -f ~/.bashrc ] && . ~/.bashrc ao ~/.bash_profile e consolide a configuração em ~/.bashrc.

Sintoma: Uma variável não é visível a partir de um script

Causa: Ainda é uma variável de shell e não foi exportada

Verificação:

export -p | grep VAR

Correção: Promova variáveis passadas a um filho (script) a variáveis de ambiente com export VAR.

Sintoma: Uma variável não é aplicada sem source

Causa: Uma adição ao arquivo de inicialização só entra em vigor a partir de um novo shell

Verificação:

echo $EDITOR

Correção: Para aplicar imediatamente no shell atual, execute source ~/.bashrc. Também será aplicado ao abrir um novo terminal.

Lista de Verificação

  • [ ] Confirmou que variáveis de shell não são herdadas por processos filhos
  • [ ] Confirmou a herança pelos filhos após export
  • [ ] Confirmou a diferença de exibição entre set e env
  • [ ] Editou .bashrc e aplicou imediatamente com source
  • [ ] Removeu uma variável com unset

Resumo

Cenário Comando Finalidade
Variável de shell VAR=value Valor temporário dentro do shell atual
Promover export VAR Herdar para filhos
Listar (ambiente) env / printenv Inspecionar variáveis de ambiente
Listar (todas) set Inclui variáveis de shell
Aplicar agora source ~/.bashrc Recarregar arquivo de inicialização

O modelo de variáveis de ambiente está diretamente ligado à compreensão da herança de processos. Em seguida, avance para o controle de prioridade de processos para conectar o conhecimento operacional.

Próximas 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

Prática