Variáveis de ambiente: export, .bashrc e .bash_profile

1. O que são variáveis de ambiente no Bash

Variáveis de ambiente são pares chave-valor que influenciam o comportamento de processos em execução no sistema. No Bash, elas funcionam como um mecanismo de comunicação entre o shell e os programas que ele executa. Diferentemente das variáveis de shell (locais), que existem apenas na sessão atual do shell, as variáveis de ambiente são herdadas por processos filhos e sub-shells.

Variáveis de shell comuns incluem $variavel_local, que só existe dentro do shell que a definiu. Já variáveis de ambiente como PATH, HOME, USER e SHELL estão disponíveis para qualquer programa iniciado a partir do shell. Por exemplo:

echo "Meu diretório home é: $HOME"
echo "Meu shell padrão é: $SHELL"
echo "Meu usuário é: $USER"
echo "O PATH atual é: $PATH"

A variável PATH merece destaque: ela contém uma lista de diretórios separados por dois-pontos (:) onde o sistema procura por executáveis. Sem ela, você precisaria digitar o caminho completo de cada comando.

2. O comando export: tornando variáveis acessíveis

O comando export transforma uma variável de shell em variável de ambiente, disponibilizando-a para processos filhos. Sua sintaxe básica é:

export MINHA_VAR="valor"

Ou em duas etapas:

MINHA_VAR="valor"
export MINHA_VAR

Para visualizar todas as variáveis exportadas atualmente, use env ou printenv:

env | grep MINHA_VAR
printenv MINHA_VAR

A diferença prática fica clara com um exemplo:

# Variável local (não exportada)
LOCAL="somente neste shell"
bash -c 'echo $LOCAL'  # Não exibe nada

# Variável de ambiente (exportada)
export AMBIENTE="disponível para filhos"
bash -c 'echo $AMBIENTE'  # Exibe: disponível para filhos

3. Arquivos de inicialização do Bash: visão geral

O Bash carrega diferentes arquivos de configuração dependendo de como é iniciado. Existem dois modos principais:

Shell de login: iniciado quando você faz login via terminal (SSH, console físico, ou com --login). A ordem de carregamento é:
1. /etc/profile (configurações globais do sistema)
2. ~/.bash_profile (ou ~/.bash_login ou ~/.profile, nesta ordem de precedência)

Shell não-login interativo: comum ao abrir um terminal no ambiente gráfico. Carrega apenas:
1. ~/.bashrc

Shell não-interativo (scripts): geralmente não carrega esses arquivos, a menos que explicitamente configurado.

4. .bashrc: configurações para shells interativos

O arquivo ~/.bashrc é executado toda vez que você abre um novo terminal no ambiente gráfico. Por isso, é o local ideal para definir aliases, funções e variáveis de ambiente que você deseja disponíveis em todas as sessões interativas.

Exemplo prático de .bashrc:

# ~/.bashrc

# Adicionar diretórios personalizados ao PATH
export PATH="$HOME/bin:$HOME/.local/bin:$PATH"

# Definir editor padrão
export EDITOR=nano
export VISUAL=nano

# Aliases úteis
alias ll='ls -lah'
alias ..='cd ..'
alias gs='git status'

# Variáveis de ambiente para desenvolvimento
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
export M2_HOME="$HOME/tools/apache-maven-3.8.6"
export PATH="$M2_HOME/bin:$PATH"

# Prompt personalizado
export PS1='[\u@\h \W]\$ '

5. .bash_profile e .bash_login: configurações para login

O ~/.bash_profile é executado apenas uma vez, durante o login. Por isso, é comum usá-lo para definir variáveis que não mudam frequentemente ou para iniciar programas específicos.

Uma estratégia amplamente adotada é fazer o .bash_profile carregar o .bashrc:

# ~/.bash_profile

# Carregar configurações do bashrc
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

# Variáveis específicas de login
export PATH="/opt/some-app/bin:$PATH"
export DISPLAY=:0

Isso garante que as configurações do .bashrc estejam disponíveis mesmo em shells de login, evitando duplicação de código.

6. Escopo e persistência das variáveis

O ciclo de vida de uma variável de ambiente definida manualmente no terminal termina quando a sessão é encerrada. Para persistência, é necessário definir as variáveis nos arquivos de inicialização apropriados.

Variáveis definidas em /etc/environment afetam todos os usuários do sistema, enquanto ~/.pam_environment oferece configurações por usuário no login via PAM.

Exemplo de /etc/environment:

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

A diferença prática entre exportar no terminal vs. nos arquivos:

# No terminal (válido apenas para esta sessão)
export TEMP_VAR="sumiu ao fechar"

# No .bashrc (persistente para shells interativos)
echo 'export PERSISTENTE="sempre disponível"' >> ~/.bashrc

7. Como editar e recarregar as configurações

Para editar os arquivos, use seu editor preferido:

nano ~/.bashrc
vim ~/.bash_profile

Ou adicione linhas com redirecionamento:

echo 'export MEU_CAMINHO="/home/user/apps"' >> ~/.bashrc

Após editar, recarregue sem reiniciar o terminal:

source ~/.bashrc
# ou
. ~/.bashrc

Verifique se a variável foi carregada:

echo $MEU_CAMINHO
env | grep MEU_CAMINHO

8. Armadilhas comuns e boas práticas

Sobrescrita acidental do PATH: sempre use $PATH ao final da atribuição:

# ERRADO: sobrescreve completamente o PATH
export PATH="/meu/diretorio"

# CORRETO: adiciona ao início mantendo o original
export PATH="/meu/diretorio:$PATH"

Export desnecessário em scripts: em scripts, variáveis locais geralmente são suficientes. Use export apenas quando precisar que um subprocesso as herde.

Separando configurações por host: use condicionais no .bashrc:

if [ "$(hostname)" = "servidor-producao" ]; then
    export NODE_ENV=production
    export DATABASE_URL="postgresql://..."
fi

Boas práticas resumidas:
- Coloque aliases e funções no .bashrc
- Use .bash_profile apenas para carregar .bashrc e configurar variáveis de login
- Evite duplicar configurações entre os arquivos
- Sempre use aspas ao definir valores com espaços: export VAR="valor com espacos"
- Documente suas variáveis com comentários

Referências