Как оболочка ищет команду
Когда вы вводите в терминале имя программы без пути, оболочка не сканирует весь диск. Она просматривает только каталоги, которые перечислены в переменной окружения PATH, причём по порядку слева направо, и запускает первый найденный файл с подходящим именем. Если ни в одной папке такого файла нет, вы видите сообщение «command not found».
Поэтому сообщение не означает, что программа не установлена. Она может лежать на диске, просто в каталоге, который не входит в список поиска. Другая частая причина — опечатка в имени или различие в регистре букв: в Linux имена команд чувствительны к регистру, а в macOS это зависит от файловой системы.
Есть команды, которые вообще не лежат в файлах: встроенные команды оболочки, например cd, и алиасы, определённые в вашем профиле. Они работают без поиска по PATH, но при запуске из другого окружения, например из планировщика, их может не быть.
Увидеть, что именно будет запущено, помогает type имя: оно сообщает, встроена ли команда, алиас она или файл, и показывает полный путь. Команда which имя ищет файл по PATH и тоже выводит путь.
Как посмотреть и прочитать PATH
Выполните echo $PATH. Результат — одна строка, в которой каталоги разделены двоеточиями. Для удобства можно вывести каждый путь с новой строки: echo $PATH | tr ':' '\n'.
Какие каталоги встречаются в такой строке, зависит от системы. Часто видны такие места.
| Каталог | Что обычно хранится |
|---|---|
| /usr/bin | основные программы дистрибутива или системы |
| /bin | базовые команды, на многих системах это ссылка на /usr/bin |
| /usr/local/bin | программы, которые администратор ставит вручную |
| /usr/sbin, /sbin | программы для администрирования |
| /opt/homebrew/bin | пакеты Homebrew на Mac с Apple Silicon |
| ~/.local/bin | пользовательские программы в ряде дистрибутивов |
Порядок имеет значение. Если одноимённые программы лежат в двух каталогах, запустится та, что левее. Это объясняет ситуацию, когда после установки новой версии продолжает работать старая: в PATH раньше стоит каталог со старой. Команда which -a имя покажет все совпадения по порядку, и вы увидите, кто кого заслоняет.
Порядок действий при command not found
Не спешите ставить программу заново. Проверьте по порядку.
- Проверьте написание: опечатки и регистр букв. Попробуйте вызвать подсказку автодополнения клавишей Tab.
- Убедитесь, что программа вообще на диске. Для файла из пакета используйте менеджер пакетов; для найденной вручную — find или locate, если он установлен.
- Если файл найден, запустите его по полному пути. Если так работает, а по имени нет, дело именно в PATH.
- Посмотрите содержимое PATH и убедитесь, что нужного каталога там нет.
- Добавьте каталог (см. следующий раздел) или создайте в уже подходящей папке ссылку на программу.
- Откройте новое окно терминала и проверьте снова: изменения в файле настроек подхватываются только новыми сессиями.
Отдельный случай — файл найден, но при запуске по полному пути выдаётся «Permission denied»: у файла нет бита выполнения. Исправляется командой chmod с ключом +x для этого файла. А сообщение «No such file or directory» при запуске существующего скрипта часто означает неверную первую строку с указанием интерпретатора.
Как добавить папку в PATH и сделать это постоянным
Для текущего окна терминала достаточно одной команды: export PATH="$PATH:/путь/к/папке". Папка добавится в конец списка, и поиск в ней будет идти последним. Если нужно, чтобы она имела приоритет, ставят её в начало: export PATH="/путь/к/папке:$PATH". Закрыв окно, вы потеряете изменение.
Чтобы сделать его постоянным, строку добавляют в файл настроек вашей оболочки. Какой именно файл, зависит от оболочки и системы: в современном macOS по умолчанию используется zsh с файлом .zprofile или .zshrc, в большинстве дистрибутивов Linux — bash с файлом .bashrc или .profile. Проверить свою оболочку можно командой echo $SHELL. После правки файла откройте новое окно или выполните команду source с именем файла.
Что нельзя делать:
- не заменять PATH целиком, а не дополнять его: после такой команды перестанут находиться даже базовые программы, а исправить поможет только новое окно терминала;
- не добавлять в PATH текущую папку (точку) ради удобства: тогда вы рискуете случайно запустить чужой файл с привычным именем;
- не добавлять каталоги, в которые могут писать другие пользователи.
Почему в cron и графических программах PATH другой
Одна и та же команда может работать в терминале и не работать в планировщике или при запуске из значка. Причина в том, что PATH формируется для каждой сессии отдельно. Терминал читает файлы настроек вашей оболочки, а cron, launchd или служба systemd используют короткий стандартный набор каталогов.
Решение для автоматических задач — указывать полные пути к программам и скриптам, а если нужны особые каталоги, задавать PATH в самом задании или в начале скрипта. Для cron и launchd решение одно и то же.
В macOS графические приложения запускаются не из оболочки и не читают ваш .zshrc, поэтому переменные, заданные там, им недоступны. Для них нужны другие механизмы, и часто проще указывать пути напрямую в настройках самого приложения.
Если вы устанавливаете программы через менеджер пакетов, после установки внимательно прочитайте итоговое сообщение: Homebrew, например, подсказывает, какую строку добавить для вашей оболочки. Пропуск этого шага — самая частая причина жалобы «установил, а не находится».
Короткий чек-лист на случай, если команда не находится
Когда программа не находится, быстрая последовательность проверок помогает не метаться между гипотезами.
- Выполните type имя: если ответ «not found», команды нет ни как встроенной, ни как файла в PATH.
- Запустите файл по полному пути, если знаете, где он лежит: это отделяет проблему PATH от проблемы прав и самой программы.
- Проверьте echo $SHELL и убедитесь, что правите файл настроек именно той оболочки, которую используете.
- Откройте новое окно терминала после правки: старые окна не перечитывают файл.
- Проверьте, не лежит ли программа в каталоге пользователя другого аккаунта: при работе через sudo PATH бывает другим, потому что система нередко подставляет собственный безопасный список каталогов.
Если вы работаете в чужой системе или на общем сервере, не меняйте глобальные настройки PATH для всех пользователей без согласования. Личных правок в домашней папке почти всегда достаточно, и они не затрагивают остальных.