Variáveis de ambiente
Esta aula explora as variáveis de ambiente no shell Linux/Bash, abordando desde conceitos fundamentais até a prática com PATH, HOME, USER, export, env e arquivos de inicialização. Você aprenderá como consultar, definir e persistir variáveis, além de boas práticas para personalizar seu ambiente de trabalho.
Variáveis de ambiente são um dos pilares da personalização e do funcionamento do shell Linux. Elas armazenam informações que influenciam o comportamento de programas e do próprio sistema, como caminhos de busca, configurações de usuário e preferências de aplicativos. Nesta aula, vamos mergulhar no universo dessas variáveis: entender o que são, como visualizá-las, como criá-las e como torná-las permanentes, além de explorar as mais importantes, como PATH, HOME e USER.
Dominar variáveis de ambiente é essencial para qualquer pessoa que trabalhe com linha de comando, pois permite configurar ferramentas, otimizar fluxos de trabalho e escrever scripts mais robustos. Vamos começar com uma visão geral e depois aprofundar em cada tópico, sempre com exemplos práticos que você pode testar no seu terminal.
PATH
A variável PATH é uma das mais críticas do sistema. Ela define uma lista de diretórios onde o shell procura por executáveis quando você digita um comando sem especificar o caminho completo. Por exemplo, ao digitar ls, o shell percorre cada diretório listado em PATH até encontrar o binário ls.
A estrutura do PATH é uma string com diretórios separados por dois-pontos (:). A ordem importa: o shell verifica na sequência e usa o primeiro executável encontrado. Isso significa que você pode ter versões diferentes do mesmo programa em diretórios distintos e controlar qual será usado apenas ajustando a ordem no PATH.
# Ver o PATH atual
echo $PATH
# Adicionar um diretório ao PATH (apenas para a sessão atual)
export PATH="/meu/novo/diretorio:$PATH"
# Adicionar ao final (menos prioritário)
export PATH="$PATH:/outro/diretorio"
# Verificar se um diretório está no PATH
which comando
É comum adicionar diretórios como ~/bin ou ~/.local/bin ao PATH para instalar programas localmente. No entanto, é preciso cuidado com a ordem: colocar diretórios antes dos padrão pode fazer com que versões alternativas de comandos sejam usadas, o que pode gerar conflitos. Uma boa prática é adicionar novos diretórios ao final, a menos que você queira explicitamente sobrepor um comando existente.
HOME, USER
A variável HOME armazena o caminho do diretório pessoal do usuário atual. Ela é usada por muitos programas para localizar arquivos de configuração, como ~/.bashrc ou ~/.config. O til (~) no shell é uma abreviação para $HOME, e você pode usar ambos indistintamente.
Já a variável USER (ou LOGNAME em alguns sistemas) contém o nome do usuário logado. Ela é útil em scripts para personalizar mensagens ou criar diretórios específicos por usuário. Vejamos como consultá-las e usá-las:
# Exibir HOME e USER
echo "Meu diretório pessoal é: $HOME"
echo "Usuário atual: $USER"
# Usar em um script para criar um arquivo no diretório pessoal
echo "Backup de $(date)" > "$HOME/backup.txt"
# Comparar com o til
echo "Usando til: ~"
echo "Usando \$HOME: $HOME"
Essas variáveis são definidas pelo sistema no login e geralmente não devem ser alteradas. Se você precisar modificar o diretório pessoal, é melhor mudar a configuração do usuário no sistema (por exemplo, com usermod -d) do que simplesmente redefinir HOME, pois isso pode quebrar acessos e permissões.
export e env
Quando você define uma variável no shell, ela pode ser local (apenas para o shell atual) ou exportada (disponível para processos filhos). O comando export marca uma variável como exportada, fazendo com que ela seja copiada para o ambiente de programas executados a partir do shell. Sem export, a variável não é visível para subprocessos.
# Definir uma variável local
MINHA_VAR="olá"
# Executar um script que tenta acessá-la (não vai funcionar)
bash -c 'echo $MINHA_VAR' # saída vazia
# Exportar a variável
export MINHA_VAR
# Agora o script enxerga
bash -c 'echo $MINHA_VAR' # saída: olá
O comando env tem duas funções principais: listar todas as variáveis de ambiente (quando chamado sem argumentos) e executar um programa com um ambiente modificado. Por exemplo, env VAR=valor comando define uma variável temporariamente apenas para aquele comando.
# Listar todas as variáveis de ambiente
env
# Executar um comando com uma variável temporária
env MEU_VAR="teste" printenv MEU_VAR # imprime teste
# Verificar se uma variável está exportada
printenv MINHA_VAR
É importante entender a diferença entre variáveis de shell (locais) e variáveis de ambiente (exportadas). Variáveis locais são usadas para controle interno do shell, enquanto as exportadas são herdadas por qualquer processo filho. Por isso, ao escrever scripts, use export para variáveis que precisam ser acessadas por outros programas ou subshells.
Arquivos de inicialização
As variáveis de ambiente que você define manualmente no terminal são perdidas ao fechar a sessão. Para persistir configurações, o Bash lê arquivos de inicialização em momentos específicos. Os principais são:
/etc/profile: lido para shells de login, define variáveis para todos os usuários.~/.bash_profileou~/.bash_loginou~/.profile: lidos para shells de login do usuário (o primeiro que existir).~/.bashrc: lido para shells interativos não-login (como novas janelas de terminal)./etc/bash.bashrc: varia conforme a distribuição, lido para todos os usuários em shells interativos.
Na prática, muitas distribuições configuram ~/.bash_profile para carregar ~/.bashrc, garantindo que as mesmas configurações sejam aplicadas em ambos os casos. É recomendável adicionar suas variáveis personalizadas em ~/.bashrc, pois ele é lido em todo terminal interativo.
# Editar o arquivo de inicialização
nano ~/.bashrc
# Adicionar uma variável e exportá-la
export MEU_APP_HOME="/opt/meuapp"
# Salvar e recarregar o arquivo
source ~/.bashrc
Além de variáveis, você pode adicionar aliases, funções e configurações de prompt. Lembre-se de que mudanças em /etc/profile afetam todos os usuários e exigem privilégios de superusuário. Sempre teste alterações em um shell separado para evitar erros que impeçam o login.
Boas práticas
Ao trabalhar com variáveis de ambiente, siga estas recomendações:
- Use nomes em maiúsculas para variáveis de ambiente, por convenção.
- Prefira adicionar diretórios ao final do
PATHpara não sobrepor comandos padrão. - Evite espaços em torno do sinal de igual ao definir variáveis.
- Proteja variáveis com aspas duplas ao usá-las para evitar expansão indesejada.
- Documente variáveis importantes em comentários no
~/.bashrc.
Referências
- Bash Manual: Bourne Shell Variables
- Linux man page: environ(7)
- Advanced Bash-Scripting Guide: Other Types of Variables
- Bash Manual: Startup Files
- Cyberciti: Linux List All Environment Variables
Exercícios
Qual comando você usaria para exibir o valor da variável
PATH? E como adicionar o diretório~/scriptsao início doPATHde forma persistente?✓ Resposta:echo $PATHpara exibir. Para adicionar de forma persistente, edite~/.bashrce adicione a linha:export PATH="$HOME/scripts:$PATH". Depois, executesource ~/.bashrc.Explique a diferença entre definir uma variável com
VAR=valoreexport VAR=valor. Dê um exemplo onde essa diferença é crucial.✓ Resposta:VAR=valordefine uma variável local ao shell, não disponível para subprocessos.export VAR=valora torna disponível para processos filhos. Exemplo: se você defineMEU_VAR="x"e executabash -c 'echo $MEU_VAR', não verá nada; comexport, verá “x”.Crie um script que verifique se a variável
EDITORestá definida. Se estiver, imprima "Seu editor é: $EDITOR"; caso contrário, defina comonanoe imprima uma mensagem avisando.✓ Resposta:#!/bin/bash if [ -n "$EDITOR" ]; then echo "Seu editor é: $EDITOR" else export EDITOR="nano" echo "EDITOR não definido, definindo como nano" fiQual arquivo de inicialização você deve editar para que uma variável de ambiente esteja disponível em todos os shells interativos do seu usuário? Por quê?
✓ Resposta:~/.bashrc, pois ele é lido para shells interativos não-login, que são a maioria dos terminais abertos. Shells de login usam~/.bash_profile, mas muitas distros fazem com que ele carregue o~/.bashrc.O que o comando
envfaz quando chamado sem argumentos? E como você usariaenvpara executar um comando com uma variável temporária sem afetar a sessão atual?✓ Resposta:envlista todas as variáveis de ambiente. Para executar um comando com uma variável temporária, useenv VAR=valor comando, por exemplo:env MEU_APP="teste" ./app.