Как исправить ошибку «command not found» в Linux

TL;DR
Если в терминале появляется «command not found», проверьте: нет ли опечатки или ошибки регистра, установлен ли пакет, есть ли полный путь к исполняемому файлу и включён ли путь в переменную PATH. Для редко используемых программ добавьте исполняемый файл в PATH или установите пакет через пакетный менеджер. Внизу — пошаговый чеклист, decision tree и рекомендации по безопасности.
Важно: сообщение «command not found» — симптом, а не причина. Сначала диагностируйте, затем исправляйте.
Почему команда может не находиться
Linux и Unix-системы чувствительны к регистру: ls и LS — разные вещи. Терминал ищет исполняемый файл по каталогам из переменной окружения PATH. Если команда не в PATH или не помечена как исполняемая, вы получите ошибку.
Краткое определение: PATH — это список каталогов, в которых shell ищет исполняемые файлы при вводе команды.
Основные шаги диагностики
- Проверка синтаксиса и регистра
- Проверка наличия исполняемого файла и прав
- Проверка PATH и добавление туда пути
- Установка отсутствующих пакетов
- Запуск с повышенными привилегиями при необходимости
Каждый шаг описан подробно ниже с примерами и практическими подсказками.
1. Проверка синтаксиса и регистра
Linux разделяет верхний и нижний регистр. Убедитесь, что команда написана правильно.
Пример: команда ssh с параметрами перенаправления портов требует точного регистра:
ssh -fN -L 80:localhost:8080 user@hostОбъяснение: параметры -L и -N должны быть указаны именно в таком регистре. Некоторые опции принимают одну или две черты: -v и –version — это разные синтаксисы, используйте правильный.
Совет: используйте Tab для автозаполнения имён команд и путей — это снижает опечатки.
2. Укажите полный путь к исполняемому файлу, если это скрипт
Если вы написали скрипт или установили программу в произвольную папку, shell не найдёт её, пока путь не будет в PATH или вы не запустите её с указанием полного пути.
Пример: если ovftool установлен в /opt/ovf:
sudo /opt/ovf/ovftoolЕсли вы пытаетесь запустить локальный скрипт в текущей директории, укажите ./:
./myscript.shИначе shell будет считать имя myscript.sh не найденным.
3. Используйте переменную PATH
Чтобы не указывать полный путь каждый раз, добавьте каталог с исполняемыми файлами в PATH.
Правильный синтаксис экспорта в текущую сессию bash/zsh:
export PATH=$PATH:/opt/path/to/your/programПример для пользователя .NET Tools:
export PATH=$PATH:~/.dotnet/toolsЧтобы изменения сохранялись между сессиями, добавьте строку в ~/.bashrc, ~/.profile или ~/.zshrc в зависимости от используемого shell, затем примените изменения командой:
source ~/.bashrcПроверить текущий PATH:
echo $PATHВажно: не вставляйте пробелы вокруг знака равенства при назначении PATH (ошибка: PATH = $PATH:… приведёт к ошибке в shell).
4. Убедитесь, что программа установлена
Если команда не является встроенной, возможно, пакет не установлен. Используйте пакетный менеджер вашей дистрибуции:
- Debian/Ubuntu и производные:
sudo apt update
sudo apt install - RHEL/CentOS/Fedora:
sudo dnf install
# или
sudo yum install - Arch Linux:
sudo pacman -S Подсказка: попробуйте поискать пакет по имени команды (в Ubuntu: apt search <команда> или apt-file search <команда>, если установлен apt-file).
5. Проверьте права доступа и запуск от root
Даже если исполняемый файл на месте и в PATH, у него должны быть права на выполнение:
ls -l /path/to/commandЕсли отсутствует флаг x (execute), добавьте его:
chmod +x /path/to/commandЕсли программа требует привилегий, запустите с sudo:
sudo commandСовет по безопасности: не добавляйте каталоги с ненадёжными бинарниками в PATH систему-wide. Для временных экспериментов используйте локальный PATH в сессии.
Типичные случаи и нюансы
- Команды, написанные на Python/Node/Perl: убедитесь, что shebang (#!/usr/bin/env python3) присутствует и файл исполняемый.
- Если команда установлена в ~/.local/bin, убедитесь, что ~/.local/bin включён в PATH (часто требуется добавить в .profile).
- Скрипты с CRLF (Windows) могут не запускаться. Удалите переводы строк Windows:
dos2unix myscript.sh- Если команда существует, но shell всё равно не находит её — проверьте, используется ли другой shell (sh vs bash vs zsh) и какие конфигурационные файлы загружаются.
Быстрый чеклист по диагностике (для повседневного использования)
- Правильно ли набрано имя команды (регистр, опечатки)?
- Что возвращает which/command -v? (есть ли путь)
- Исполняемый файл существует и помечен как исполняемый (ls -l)
- Каталог с программой в PATH (echo $PATH)
- Установлен ли пакет (попробовать пакетный менеджер)
- Нужны ли права root (sudo)?
Примеры команд для проверки:
command -v mycommand || which mycommand
ls -l $(command -v mycommand 2>/dev/null || echo /path/that/does/not/exist)Роль-ориентированные чеклисты
Для разработчика:
- Убедиться, что virtualenv/venv или nvm активированы
- Проверить shebang и права на исполнение
- Добавить ./ в PATH только в особых случаях
Для системного администратора:
- Проверить системные PATH (/etc/profile, /etc/profile.d)
- Убедиться, что системные службы видят PATH при запуске
- Проверить SELinux/AppArmor, которые могут блокировать запуск
Для новичка:
- Использовать пакетный менеджер для установки
- Включить ~/.local/bin в PATH через .profile
- Использовать Tab для автодополнения
Методика быстрого устранения (мини‑методология)
- Повторите ошибку и зафиксируйте сообщение.
- Выполните command -v <имя> и echo $PATH.
- Если command -v ничего не возвращает, выполните which <имя>.
- Найдите файл: sudo find / -type f -name ‘<имя>’ 2>/dev/null.
- Если найден файл — проверьте права и shebang.
- Если не найден — установите пакет.
- Если установлен, но не запускается в сервисе — проверьте окружение сервиса (systemd unit Environment).
Decision tree (графическое представление в виде Mermaid)
flowchart TD
A[Начало: увидели 'command not found'] --> B{Правильно ли имя?}
B -- Нет --> C[Исправить опечатку / регистр]
B -- Да --> D[command -v <имя>]
D -- Есть путь --> E[Проверить права: ls -l]
E -- Не исполняемый --> F[chmod +x и попробовать снова]
E -- Исполняемый --> G[Пробовать sudo / проверить зависимости]
D -- Нет пути --> H[Ищем пакет или файл с помощью find / apt search]
H -- Найден пакет --> I[Установить пакет]
H -- Не найден --> J[Добавить путь в PATH или установить программу]
C --> K[Повторить команду]
F --> L[Успешно]
G --> L
I --> L
J --> LКритерии приёмки
- Ввод команды приводит к ожидаемому бинарному запуску (или явному сообщению об ошибке).
- command -v возвращает путь к исполняемому файлу.
- Исполняемый файл имеет права на выполнение и корректный shebang.
- PATH корректно настроен для целевой сессии (интерактивной) и служебных unit (systemd).
Тесты и сценарии приёмки
- Выполнить новую команду в чистой сессии; ожидается запуск.
- Установить пакет, убедиться, что command -v возвращает путь.
- Запустить программу как сервис; убедиться, что systemd unit видит PATH (systemctl show-environment).
Меры безопасности и рекомендации
- Не добавляйте “/“ или пустые строки в начало PATH — это потенциально опасно.
- Избегайте добавления папок, в которые могут записывать другие пользователи, в системный PATH.
- Проверяйте подписи пакетов и устанавливайте программы из надёжных репозиториев.
- Для временного тестирования используйте песочницу или контейнер (docker) вместо изменения системного PATH.
Частые ошибки и когда описанные методы не помогут
- Программа требует специфичных зависимостей или библиотек — установка пакета не решит проблему без разрешения зависимостей.
- Проблемы с SELinux/AppArmor могут блокировать исполняемые файлы даже при правильном PATH и правах.
- Если сервис запускается с другим пользователем, его окружение (и PATH) может отличаться — настройка интерактивного PATH не исправит проблему для systemd.
Краткий глоссарий (1 строка на термин)
- PATH — список каталогов, где shell ищет исполняемые файлы.
- Shebang — строка в начале скрипта вида #!/usr/bin/env
, указывающая интерпретатор. - Shell — интерфейс командной строки (bash, zsh, sh).
Быстрая шпаргалка (cheat sheet)
- Проверить наличие: command -v
- Проверить права: ls -l $(command -v
) - Добавить в PATH временно: export PATH=$PATH:/your/path
- Сохранить в Bash: echo ‘export PATH=$PATH:/your/path’ >> ~/.bashrc
- Запустить локальный скрипт: ./script.sh
Часто задаваемые вопросы
В: Что делать, если which возвращает путь, а команда всё равно не запускается?
A: Проверьте права выполнения, shebang, зависимости (ldd для бинарей), и SELinux/AppArmor. Для скриптов — проверьте кодировку и переводы строк.
В: Как добавить ~/.local/bin в PATH для всех логинов?
A: Добавьте export PATH=$PATH:$HOME/.local/bin в ~/.profile или /etc/profile.d/custom.sh для всех пользователей.
Резюме
Ошибка «command not found» обычно вызвана одной из нескольких причин: опечатка/регистр, отсутствие установки, неправильные права или PATH. Последовательно пройдитесь по чеклисту, используйте command -v/which, проверьте права и PATH, и только затем вносите более радикальные изменения в систему. Следуйте рекомендациям по безопасности и используйте контейнеры для экспериментов.
Важно: при работе с системными PATH и правами придерживайтесь принципа наименьших привилегий.
Похожие материалы
Как добавить скрытые приватные каналы на Roku
Восстановление системного образа Windows
Управление разделами и томами в Windows 10
UFW — настройка брандмауэра в Linux
Диаграммы в Google Docs: быстро и просто