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
.bashrce.bash_profilecorretamente 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
seteenv - [ ] Editou
.bashrce aplicou imediatamente comsource - [ ] 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.