Corrigindo Erros "command not found" - Solucoes Quando Comandos Estao Ausentes

Corrigindo Erros "command not found" - Solucoes Quando Comandos Estao Ausentes

O Que Voce Vai Aprender

  • Diagnosticar erros command not found em menos de 30 segundos
  • Reconhecer padroes tipicos para PATH / hash / sudo / cron
  • Parar o problema "eu instalei mas nao encontra" de acontecer novamente

Resumo Rapido

  1. Verifique a existencia com command -v <nome>
  2. Mostre os caminhos de busca com echo $PATH
  3. A causa e quase sempre uma destas: pacote ausente / PATH nao configurado / cache hash obsoleto / secure_path do sudo / erro de digitacao

Ambiente Alvo

  • SO: Ubuntu / Debian (apt). Familia RHEL (dnf / yum) incluida quando relevante
  • Shell: bash / zsh

1. As 5 Causas Raiz

Conclusao: As causas sao: pacote ausente, PATH, hash obsoleto, secure_path do sudo ou erro de digitacao.

Quase todo erro command not found se resume a uma destas:

# Causa Chave de diagnostico
1 Comando nao esta instalado apt-cache search / dnf provides
2 Executavel nao esta no PATH echo $PATH / which -a
3 Cache hash do shell esta obsoleto hash -r
4 Restricao de secure_path do sudo sudo -V / secure_path em /etc/sudoers
5 Erro de digitacao (maiusculas / ortografia) type / compgen -c

80% dos casos sao #2 PATH ou #3 hash. Sempre verifique esses dois primeiro.

2. Passos de Diagnostico (Template de 30 Segundos)

Conclusao: Use command -v para verificar, echo $PATH para inspecionar e depois busque o pacote.

2-1. Verifique a existencia primeiro

$ command -v ansible
  • Saida presente --> o comando esta visivel. Se ainda falhar, e um problema de permissao (nao command not found).
  • Sem saida --> continue para 2-2.

command -v e padrao POSIX. O comportamento de which varia por distro (o which do Debian retorna apenas um codigo de saida), entao prefira command -v em scripts. Use type para investigacao, pois ele distingue alias / funcao / builtin / arquivo.

2-2. Mostre o PATH

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Verifique se o diretorio de instalacao esperado esta no PATH. Diretorios comuns:

  • ~/.local/bin (pip install --user / pipx)
  • ~/bin (adicionado automaticamente pelo ~/.profile do Ubuntu, mas apenas para login shells do bash)
  • /usr/local/bin (ferramentas compiladas manualmente)
  • /snap/bin (instalados via snap)

2-3. Busque o pacote

Se o comando nao esta instalado, descubra qual pacote o fornece.

# Ubuntu / Debian
$ apt-cache search ^ansible$
$ /usr/lib/command-not-found ansible    # dica util do Ubuntu
# RHEL / Fedora
$ dnf provides '*/ansible'

3. Correcoes Caso a Caso

Conclusao: As correcoes variam por caso: instalacao recente, pip ou npm, erro de digitacao e troca de shell.

3-1. Acabou de instalar mas ainda nao encontra

O shell armazenou em cache um caminho antigo via hash.

$ hash -r          # funciona tanto no bash quanto no zsh
$ rehash           # idioma do zsh

Se isso nao ajudar, ou o diretorio bin do novo pacote nao esta no PATH, ou voce instalou como um usuario diferente (ex: root).

3-2. pip install --user command not found

O local de instalacao e ~/.local/bin. Adicione ao PATH.

$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

Para CLIs Python, prefira pipx. Executar pipx ensurepath configura o PATH automaticamente, entao e mais seguro que pip install --user.

3-3. npm install -g command not found

Verifique o prefixo de instalacao com npm config get prefix. Se for /usr/local, voce pode ter um problema de permissao. Se for um prefixo personalizado como ~/.npm-global, adicione seu bin ao PATH.

$ npm config get prefix
$ ls "$(npm config get prefix)/bin"

3-4. Sensibilidade a maiusculas / erro de digitacao

Nomes de arquivo no Linux sao sensíveis a maiusculas e minusculas.

$ Vim file.txt      # --> command not found
$ vim file.txt      # OK

Liste candidatos:

$ compgen -c vim    # comandos que comecam com "vim"

3-5. Nao encontra apos trocar de shell

Ao trocar de bash --> zsh, o arquivo onde o PATH e configurado muda.

Shell Login shell Shell interativo
bash ~/.bash_profile --> ~/.profile ~/.bashrc
zsh ~/.zprofile ~/.zshrc

~/.profile e lido por shells POSIX. ~/.bashrc e exclusivo do bash e nao e lido pelo zsh. Se voce trocar para zsh, mova suas configuracoes de PATH para ~/.zshrc.

4. Persistindo o PATH Corretamente

Conclusao: Sempre adicione ao $PATH, nunca sobrescreva; use /etc/profile.d para todo o sistema.

4-1. Padrao recomendado

# No final de ~/.bashrc ou ~/.zshrc
export PATH="$HOME/.local/bin:$PATH"
  • A ordem (antes vs. depois de $PATH) controla a prioridade
  • Coloque seus scripts personalizados antes de $PATH para sobrescrever comandos do sistema
  • Coloque-os depois para deixar os comandos do sistema prevalecerem

4-2. PATH para todo o sistema

Use /etc/profile.d/*.sh. Note que /etc/environment aceita apenas atribuicoes de variaveis (sem sintaxe de shell).

# /etc/profile.d/myapp.sh
export PATH="/opt/myapp/bin:$PATH"

5. Nao Encontra com sudo / cron

Conclusao: sudo usa secure_path e cron um PATH minimo; use caminhos completos ou defina o PATH.

5-1. command not found com sudo

sudo sobrescreve o PATH com secure_path do /etc/sudoers.

$ sudo -V | grep -i path
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Correcoes:

# (1) Use o caminho completo (mais confiavel)
$ sudo /home/user/.local/bin/myscript

# (2) Transporte o ambiente com sudo -E (pode ser ignorado quando secure_path esta definido)
$ sudo -E env "PATH=$PATH" myscript

# (3) Correcao permanente: edite secure_path com visudo
$ sudo visudo
# Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/.local/bin"

secure_path existe para prevenir ataques de injecao de PATH durante escalonamento de privilegios. Nao amplie descuidadamente -- adicione apenas os diretorios que realmente precisa.

5-2. command not found no cron

O cron inicia com um PATH minimo.

$ env -i sh -c 'echo $PATH'
/usr/bin:/bin

Correcoes (em ordem de preferencia):

# (1) Declare PATH no topo do crontab
PATH=/usr/local/bin:/usr/bin:/bin:/home/user/.local/bin
* * * * * myscript

# (2) Use caminhos absolutos no script
* * * * * /home/user/.local/bin/myscript

70% dos problemas do cron sao PATH. O segundo maior problema e stdout/stderr nao redirecionados. Sempre adicione >> /tmp/cron.log 2>&1 para poder ver o que esta acontecendo.

6. Template de Diagnostico para Copiar e Colar

Conclusao: Um template para copiar e colar que executa verificacao, PATH, hash, busca de pacote e checagens do sudo.

# 1. Verificar existencia
command -v ansible

# 2. Mostrar PATH
echo $PATH

# 3. Limpar hash (a correcao padrao logo apos instalar)
hash -r
command -v ansible

# 4. Buscar o pacote
apt-cache search ^ansible$       # Debian / Ubuntu
dnf provides '*/ansible'         # RHEL / Fedora

# 5. Verificar com sudo
sudo command -v ansible
sudo -V | grep -i path

Coisas que voce nunca deve fazer

  • Sobrescrever PATH atribuindo PATH= sem valor existente
  • Colocar o mesmo export de PATH tanto em ~/.bash_profile quanto em ~/.profile (um sera ignorado)
  • Executar chmod 777 reflexivamente quando o sudo falha

Proximas Leituras