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


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:

BASH
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."

BASH
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.

TEXT
# 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.

💡 Dica: O PATH funciona por "busca sequencial" — o Shell percorre os diretórios do PATH da esquerda para a direita e para no primeiro compatível. Diretórios que vêm antes têm prioridade mais alta. Se um programa recém-instalado parece não funcionar, uma versão mais antiga pode estar em um diretório anterior do PATH.

BASH
# 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

BASH
# 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:

BASH

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: .bashrc e .profile carregam em momentos diferentes — o login via SSH carrega .profile, enquanto abrir um novo terminal carrega .bashrc. A melhor prática é adicionar source ~/.bashrc no .profile e colocar toda a configuração em .bashrc, para que funcione independentemente de como você fizer login.

Melhor prática: adicione isto ao .bash_profile:

BASH
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

BASH
# 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:

TEXT
Meu diretório home é: /home/alice
Usuário atual: alice
Meu Shell: /bin/bash
Olá do Linux

(6) ▶ Exemplo: Entendendo o PATH

BASH
# 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)

BASH
# 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
💡 Dica: Para tornar variáveis de ambiente permanentes, é preciso escrever o comando 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

BASH
# 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:

TEXT
EDITOR=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

BASH
# 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"

BASH
#!/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/bin vier 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 export serão perdidas após uma reinicialização. Para persistir, escreva os comandos export em um arquivo de configuração do Shell (~/.bashrc ou ~/.bash_profile).

P: O que executa primeiro, .bashrc ou .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 printenv e set? R: printenv mostra apenas variáveis de ambiente (exportadas). set mostra todas as variáveis, incluindo variáveis locais do Shell e funções. Use printenv para uma visão completa do ambiente, set para depuração de scripts.


📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Visualize o PATH atual (use tr ':' '\n' para uma exibição linha a linha mais clara) e use which python3 e type cd para entender os tipos de comandos
  2. Intermediário (Dificuldade ⭐⭐): Crie um diretório ~/scripts, escreva um script simples ola.sh, adicione-o ao PATH e execute-o diretamente; defina EDITOR=vim (ou nano) no .bashrc e verifique com source
  3. Avançado (Dificuldade ⭐⭐⭐): Escreva um script debug-path.sh que 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
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%