Corrigindo Erros "command not found" - Solucoes Quando Comandos Estao Ausentes
O Que Voce Vai Aprender
- Diagnosticar erros
command not foundem 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
- Verifique a existencia com
command -v <nome> - Mostre os caminhos de busca com
echo $PATH - 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~/.profiledo 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
$PATHpara sobrescrever comandos do sistema - Coloque-os depois para deixar os comandos do sistema prevalecerem
Nunca sobrescreva o PATH
# ERRADO: apaga o PATH existente export PATH="$HOME/.local/bin"
Isso quebra ls, cat, sudo -- tudo. Sempre mantenha $PATH e adicione.
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_profilequanto em~/.profile(um sera ignorado) - Executar
chmod 777reflexivamente quando osudofalha