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
exporte necessario - Explicar a ordem de carregamento dos arquivos de inicializacao para shells de login e nao-login
- Usar
.bashrce.bash_profilecorretamente 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
seteenv - [ ] Editou
.bashrce aplicou imediatamente comsource - [ ] 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.