Linux: Variáveis de Ambiente e PATH
Variáveis de ambiente são pares chave-valor que o sistema operacional usa para armazenar configurações. Elas determinam onde o Shell procura comandos (PATH), qual idioma usar (LANG) e qual editor usar (EDITOR).
📋 Pré-requisitos: Você deve primeiro concluir
1. O Que Você Vai Aprender
- O papel das variáveis de ambiente
- Como o PATH funciona
- Operações com export e unset
- Ordem de carregamento dos arquivos de configuração do Shell
- Como adicionar novas ferramentas ao PATH
2. A História do "command not found"
(1) O Problema: Instalou um Programa Mas Não Consegue Encontrá-lo
Alex instalou a ferramenta Python httpie com pip install --user, mas ao digitar http apareceu:
http exemplo.com
# Comando 'http' não encontrado
Alex ficou confuso: "Eu instalei, por que o sistema não encontra?"
(2) PATH — Dizendo ao Shell Onde Encontrar Programas
Bob explicou: "O programa está instalado, mas o Shell não sabe onde procurar. A variável de ambiente PATH é o 'mapa do tesouro' do Shell."
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ~/.local/bin não está no PATH, então o Shell não consegue encontrar http
ls ~/.local/bin/http*
# /home/charlie/.local/bin/http
# Adicione ~/.local/bin ao PATH
export PATH="$PATH:$HOME/.local/bin"
http exemplo.com # Agora funciona
(3) O Benefício: Entendendo o Mecanismo Por Trás de Tudo
Alex aprendeu que colocar export PATH="$PATH:~/bin" no .bashrc torna isso permanente. Agora, toda vez que ele instala uma nova ferramenta, sabe que precisa verificar se o diretório de instalação está no PATH.
3. Pontos-Chave
(1) O Que São Variáveis de Ambiente
Variáveis de ambiente são pares chave-valor armazenados no sistema operacional que todos os processos filhos herdam.
# Ver todas as variáveis de ambiente
printenv
# Ver variáveis individuais
echo $HOME
echo $USER
echo $SHELL
echo $LANG
echo $PWD
Variáveis de ambiente comuns:
| Variável | Significado | Valor típico |
|---|---|---|
HOME |
Diretório home do usuário atual | /home/alice |
USER |
Nome do usuário atual | alice |
SHELL |
Caminho do Shell atual | /bin/bash |
PATH |
Caminho de busca de comandos | /usr/bin:/bin:/usr/local/bin |
LANG |
Idioma e codificação | en_US.UTF-8 |
PWD |
Diretório de trabalho atual | /home/alice/projects |
OLDPWD |
Diretório de trabalho anterior | /etc |
EDITOR |
Editor padrão | vim |
(2) PATH — Caminho de Busca de Comandos
Quando você digita ls, o Shell procura o programa ls em cada diretório listado no PATH, em ordem. Se encontrar, executa; se não, exibe comando não encontrado.
# Ver o PATH atual
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Encontrar em qual diretório está um comando
which ls
# /usr/bin/ls
# Ver todos os locais possíveis para um comando (incluindo aliases e funções)
type ls
# ls is aliased to `ls --color=auto'
(3) Definindo e Removendo Variáveis de Ambiente
# Definição temporária (vale apenas no Shell atual)
MINHA_VAR="olá"
# Exportar como variável de ambiente (processos filhos podem acessá-la)
export MINHA_VAR="olá"
# Definir e exportar em um único comando
export MINHA_VAR="olá"
# Remover uma variável de ambiente
unset MINHA_VAR
# Definir temporariamente para um único comando (sem poluir o ambiente atual)
LANG=ja_JP.UTF-8 date
(4) Ordem de Carregamento dos Arquivos de Configuração do Shell
Entender a ordem de carregamento é importante — ela explica por que, às vezes, alterações em ~/.bashrc não entram em vigor:
Shell de Login (login via SSH, tty):
/etc/profile
~/.bash_profile (se existir, os dois seguintes são pulados)
~/.bash_login
~/.profile
Shell não-login (abrir um novo terminal):
/etc/bash.bashrc
~/.bashrc
ℹ️ Nota:
.bashrce.profilecarregam em momentos diferentes — o login via SSH carrega.profile, enquanto abrir um novo terminal carrega.bashrc. A melhor prática é adicionarsource ~/.bashrcno.profilee colocar toda a configuração em.bashrc, para que funcione independentemente de como você fizer login.
Melhor prática: adicione isto ao .bash_profile:
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
Depois coloque toda a configuração personalizada em .bashrc.
(5) ▶ Exemplo: Ver e Definir Variáveis de Ambiente
# Ver variáveis de ambiente
echo "Meu diretório home é: $HOME"
echo "Usuário atual: $USER"
echo "Meu Shell: $SHELL"
# Definir uma variável temporária
export CUMPRIMENTO="Olá do Linux"
echo $CUMPRIMENTO
# Abra uma nova janela de terminal e verifique se $CUMPRIMENTO ainda está lá
# Resposta: Não — variáveis temporárias só existem no Shell atual
Saída:
TEXTMeu diretório home é: /home/alice Usuário atual: alice Meu Shell: /bin/bash Olá do Linux
(6) ▶ Exemplo: Entendendo o PATH
# Ver o PATH atual
echo $PATH | tr ':' '\n' # Exibe um caminho por linha
# Encontrar de qual diretório o ls é carregado
which ls
# /usr/bin/ls
# O que acontece se o PATH estiver errado?
PATH="" # Limpar o PATH (perigoso!)
ls
# bash: ls: No such file or directory
# Restaurar o PATH
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Saída:
TEXT/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/bin/ls
(7) ▶ Exemplo: Adicionar ~/scripts ao PATH (Permanente)
# Crie seu próprio diretório de scripts
mkdir -p ~/scripts
# Adicione ~/scripts ao PATH (escreva no .bashrc)
echo 'export PATH="$PATH:$HOME/scripts"' >> ~/.bashrc
# Recarregue
source ~/.bashrc
# Verifique
echo $PATH | tr ':' '\n' | grep scripts
# /home/alice/scripts
export em ~/.bashrc (ou ~/.profile). Após modificar, execute source ~/.bashrc para aplicar imediatamente; caso contrário, a nova configuração só carregará em terminais abertos depois.
Saída:
TEXT/home/alice/scripts
(8) ▶ Exemplo: Configuração Comum de Variáveis de Ambiente de Desenvolvimento
# Adicione o seguinte ao ~/.bashrc
# Editor padrão
export EDITOR=vim
# Localidade
export LANG=en_US.UTF-8
# Desenvolvimento Python
export PYTHONSTARTUP=~/.pythonrc # Script de inicialização interativa do Python
export PIP_REQUIRE_VIRTUALENV=true # pip exige ambiente virtual
# Desenvolvimento Node.js
export NODE_ENV=development
export npm_config_prefix=~/.npm-global
# Desenvolvimento Go
export GOPATH=$HOME/go
export PATH="$PATH:$GOPATH/bin"
# Seus próprios scripts
export PATH="$PATH:$HOME/scripts"
export PATH="$PATH:$HOME/.local/bin"
Saída:
TEXTEDITOR=vim LANG=en_US.UTF-8 PYTHONSTARTUP=/home/alice/.pythonrc PIP_REQUIRE_VIRTUALENV=true NODE_ENV=development GOPATH=/home/alice/go
(9) ▶ Exemplo: Verificar Se um Comando Pode Ser Encontrado
# Use which para encontrar o caminho do comando
which python3
# /usr/bin/python3
# Use type para verificar o tipo do comando (alias/função/builtin/externo)
type ls
# ls is an alias for `ls --color=auto'
type cd
# cd is a shell builtin
type node
# node is /usr/bin/node
# Use command -v (método mais confiável)
command -v python3
# /usr/bin/python3
Saída:
TEXT/usr/bin/python3 ls is an alias for `ls --color=auto' cd is a shell builtin node is /usr/bin/node /usr/bin/python3
(10) ▶ Exemplo Abrangente: Depurando um Problema de "command not found"
#!/bin/bash
# debug-path.sh - Depura problemas de command not found
CMD="${1:-http}"
echo "=== 1. O que é o comando ==="
type "$CMD" 2>/dev/null || echo "type: $CMD não encontrado"
echo ""
echo "=== 2. Quais diretórios do PATH contêm este comando ==="
IFS=':' read -ra PATHS <<< "$PATH"
for dir in "${PATHS[@]}"; do
if [ -f "$dir/$CMD" ]; then
echo "Encontrado: $dir/$CMD"
fi
done
echo ""
echo "=== 3. Busca global com find ==="
find /usr /opt $HOME -name "$CMD" -type f 2>/dev/null | head -5
echo ""
echo "=== 4. Se encontrado mas não estiver no PATH ==="
echo "Execute: export PATH=\"\$PATH:/diretorio/encontrado\""
❓ Perguntas Frequentes
P: A ordem do PATH importa? R: Muito! O Shell pesquisa os diretórios do PATH em ordem e para na primeira correspondência. Se
/usr/local/binvier primeiro, ele tem prioridade sobre/usr/bin. É por isso que programas recém-instalados às vezes executam uma versão mais antiga — verifique a ordem do seu PATH.
P: As variáveis de ambiente somem depois de reiniciar? R: Variáveis temporárias definidas com
exportserão perdidas após uma reinicialização. Para persistir, escreva os comandosexportem um arquivo de configuração do Shell (~/.bashrcou~/.bash_profile).
P: O que executa primeiro,
.bashrcou.bash_profile? R: Shell de login:/etc/profile→~/.bash_profile→~/.bash_login→~/.profile(se os arquivos anteriores não existirem). Shell não-login:/etc/bash.bashrc→~/.bashrc.
P: Como definir variáveis de ambiente globais (para todos os usuários)? R: Escreva em
/etc/environment(pares simples chave-valor, sem scripts) ou em/etc/profile.d/custom.sh(suporta sintaxe de Shell, requer privilégios de root).
P: Qual é a diferença entre
printenveset? R:printenvmostra apenas variáveis de ambiente (exportadas).setmostra todas as variáveis, incluindo variáveis locais do Shell e funções. Useprintenvpara uma visão completa do ambiente,setpara depuração de scripts.
📖 Resumo
- Variáveis de ambiente são pares chave-valor no nível do SO; processos filhos herdam as variáveis de ambiente do pai
export VAR=valordefine e exporta;unset VARremove- PATH define os caminhos de busca de comandos; a ordem determina qual versão tem prioridade
which cmd/type cmdpara localizar comandos- Configurações vão em
~/.bashrc(Shell não-login) ou~/.profile(Shell de login) - Após modificar arquivos de configuração, execute
source ~/.bashrcpara aplicar imediatamente
📝 Exercícios
- Básico (Dificuldade ⭐): Visualize o PATH atual (use
tr ':' '\n'para uma exibição linha a linha mais clara) e usewhich python3etype cdpara entender os tipos de comandos - Intermediário (Dificuldade ⭐⭐): Crie um diretório
~/scripts, escreva um script simplesola.sh, adicione-o ao PATH e execute-o diretamente; definaEDITOR=vim(ounano) no.bashrce verifique comsource - Avançado (Dificuldade ⭐⭐⭐): Escreva um script
debug-path.shque receba o nome de um comando como argumento e verifique automaticamente se ele está no PATH, qual diretório o contém e sugira uma correção se não estiver no PATH