Variáveis de Ambiente no Linux: env, export e as Mais Importantes
Variáveis de ambiente são pares chave=valor que o sistema operacional mantém em memória e disponibiliza para todos os processos em execução. Elas controlam o comportamento do shell, dos programas e dos scripts — desde onde o sistema busca executáveis (PATH) até o idioma exibido nos programas (LANG).
Entender variáveis de ambiente é fundamental para administrar servidores, escrever scripts robustos e passar em certificações como LPIC-1 (tópico 105).
Listar variáveis de ambiente
Existem três comandos para listar variáveis, cada um com escopo diferente:
# env — lista apenas variáveis de ambiente exportadas
env
# printenv — igual ao env, mas pode filtrar por nome
printenv
printenv PATH # mostra só a variável PATH
printenv HOME USER # múltiplas variáveis de uma vez
# set — lista variáveis de ambiente + variáveis locais do shell + funções
set
A diferença prática: env e printenv mostram apenas o que os processos filhos herdam. set mostra tudo, inclusive variáveis temporárias que existem só na sessão atual do shell.
Variáveis de ambiente mais importantes
| Variável | Conteúdo | Exemplo |
|---|---|---|
PATH | Diretórios onde o shell busca executáveis | /usr/local/bin:/usr/bin:/bin |
HOME | Diretório home do usuário atual | /home/joao |
USER | Nome do usuário logado | joao |
SHELL | Shell padrão do usuário | /bin/bash |
LANG | Idioma e codificação padrão | pt_BR.UTF-8 |
PWD | Diretório de trabalho atual | /var/www/html |
OLDPWD | Diretório anterior (antes do último cd) | /home/joao |
EDITOR | Editor de texto padrão do sistema | vim |
TERM | Tipo de terminal em uso | xterm-256color |
PS1 | Formato do prompt do shell | \u@\h:\w\$ |
UID | ID numérico do usuário | 1000 |
HOSTNAME | Nome do host da máquina | servidor01 |
Criar e exportar variáveis
Variável local (só existe na sessão atual do shell)
# Cria variável local — processos filhos NÃO herdam
NOME="João"
echo $NOME # João
bash -c 'echo $NOME' # (vazio — filho não herda)
Variável exportada (processos filhos herdam)
# export torna a variável disponível para processos filhos
export NOME="João"
bash -c 'echo $NOME' # João — filho herda!
# Criar e exportar em uma linha só
export DB_HOST="localhost"
export DB_PORT=5432
# Ver se uma variável está exportada
export -p | grep NOME
Variável para um único comando (sem afetar o ambiente atual)
# Passa a variável APENAS para aquele comando — não altera a sessão
LANG=en_US.UTF-8 man ls # manual em inglês
# Muito útil para scripts e testes
NODE_ENV=production npm start
DEBUG=* node app.js
PYTHONDONTWRITEBYTECODE=1 python script.py
# Múltiplas variáveis antes do comando
LANG=en_US DB_HOST=prod ./meu_script.sh
O comando env
Listar variáveis filtradas
# Ver todas as variáveis de ambiente
env
# Filtrar por padrão
env | grep PATH
env | grep -i db # busca case-insensitive
Executar comando com ambiente modificado
# Sobrescrever PATH para um único comando
env PATH=/usr/local/bin:/usr/bin which python
# Adicionar variável sem afetar o shell atual
env MYSQL_HOST=db.prod.com ./backup.sh
Executar com ambiente limpo (-i)
O flag -i (ou --ignore-environment) inicia o comando com um ambiente completamente vazio — útil para testes e para garantir que nenhuma variável do ambiente do usuário afete a execução:
# Roda bash com ambiente completamente limpo
env -i bash
# Roda script com apenas as variáveis necessárias
env -i HOME=/tmp PATH=/usr/bin:/bin ./script.sh
# Ver quantas variáveis existem normalmente vs. ambiente limpo
env | wc -l # ~30–50 variáveis normalmente
env -i env | wc -l # 0
Shebang com env em scripts
Usar /usr/bin/env no shebang em vez do caminho direto do interpretador torna o script mais portável — o env encontra o interpretador no PATH do sistema, onde quer que ele esteja instalado:
#!/usr/bin/env python3
# Funciona em qualquer sistema onde python3 está no PATH
#!/usr/bin/env bash
# Melhor que #!/bin/bash em sistemas onde bash pode estar em outro local
#!/usr/bin/env node
# Comum em scripts Node.js
Variáveis permanentes: onde definir
Variáveis criadas no terminal somem quando a sessão encerra. Para torná-las permanentes, escolha o arquivo certo conforme o escopo desejado:
| Arquivo | Escopo | Quando é lido |
|---|---|---|
~/.bashrc | Usuário atual | A cada shell interativo (não-login) |
~/.bash_profile ou ~/.profile | Usuário atual | Login via terminal ou SSH |
/etc/environment | Sistema inteiro | Login de qualquer usuário (PAM) |
/etc/profile | Sistema inteiro | Login de qualquer usuário (shell login) |
/etc/profile.d/*.sh | Sistema inteiro | Login de qualquer usuário |
# Adicionar variável permanente para o usuário atual
echo 'export EDITOR=vim' >> ~/.bashrc
echo 'export JAVA_HOME=/usr/lib/jvm/java-17' >> ~/.bashrc
source ~/.bashrc # Recarrega sem precisar fechar o terminal
# Adicionar ao PATH do usuário (sem sobrescrever o PATH existente)
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
# Variável para todos os usuários do sistema
echo 'EDITOR=vim' | sudo tee -a /etc/environment
# Verificar se foi aplicado após recarregar
source ~/.bashrc
echo $EDITOR
Manipular o PATH
O PATH é a variável mais importante do sistema — ela define onde o shell procura por executáveis. A ordem dos diretórios importa: o shell usa o primeiro executável que encontrar.
# Ver o PATH atual (separado por :)
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Adicionar diretório no início do PATH (maior prioridade)
export PATH="/opt/meu_programa/bin:$PATH"
# Adicionar no final (menor prioridade)
export PATH="$PATH:/opt/meu_programa/bin"
# Verificar qual executável o shell vai usar
which python3
type python3
# Ver todos os executáveis com aquele nome no PATH
type -a python
Remover variáveis
# unset remove a variável completamente
unset NOME
echo $NOME # (vazio)
# Remover do export (mantém como local)
export -n NOME
Variáveis em scripts
#!/usr/bin/env bash
# Boas práticas em scripts
set -euo pipefail # sai em erro, trata variáveis não definidas, propaga erros em pipes
# Ler variável de ambiente com valor padrão
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
# Checar se variável obrigatória está definida
if [ -z "${API_KEY:-}" ]; then
echo "ERRO: API_KEY não definida" >&2
exit 1
fi
# Exibir variáveis definidas para debug
env | sort | grep "^DB_"
Arquivos .env e dotenv
Projetos modernos (Node.js, Python, Docker) usam arquivos .env para centralizar variáveis de configuração:
# Arquivo .env típico
DB_HOST=localhost
DB_PORT=5432
DB_NAME=meuapp
SECRET_KEY=chave-super-secreta
# Carregar no shell manualmente
export $(grep -v '^#' .env | xargs)
# Com Docker
docker run --env-file .env minha_imagem
# Com Docker Compose (lê .env automaticamente)
# Mas também pode definir explicitamente:
# env_file:
# - .env
Referência rápida
# Listar todas as variáveis exportadas
env | sort
# Criar variável local
VARIAVEL="valor"
# Exportar para processos filhos
export VARIAVEL="valor"
# Variável só para um comando
VAR=valor comando
# Ambiente limpo
env -i comando
# Remover variável
unset VARIAVEL
# Tornar permanente (usuário)
echo 'export VARIAVEL="valor"' >> ~/.bashrc && source ~/.bashrc
# Ver de onde vem um executável
which python3
type -a python3
# Adicionar ao PATH permanentemente
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc