Примеры
Проверка «есть ли команда» в скрипте (надёжно):
Найти, какой бинарь выполнится, builtin это или alias, где лежит и man к нему.
type -a cmd
alias/builtin/функция/файл — все варианты
command -v cmd
путь или пусто (для скриптов)
which cmd
только путь к файлу
whereis cmd
бинарь + man + исходники
Когда набираешь команду, оболочка ищет её в каталогах из $PATH (см. env-vars).
Эти команды отвечают на вопрос «что именно выполнится и откуда»:
type (встроенная в bash) — самая точная: различает alias, функцию, builtin и файл.command -v — переносимый способ узнать путь/факт наличия (для скриптов).which — отдельная программа, показывает только путь к файлу (не видит alias/builtin).whereis — бинарь + исходники + man-страницу.type -a и which -a показывают все совпадения по $PATH, а не только
первое, которое реально выполнится, — удобно, когда команда ведёт себя
неожиданно и подозреваешь конфликт версий. Обычный which без -a
останавливается на первом найденном файле и молчит про алиасы и функции.
| Ключ | Что делает | Пример |
|---|---|---|
-a |
which — показать все совпадения по $PATH, а не только первое. | which -a python3 |
-a |
type — показать все места, где найдена команда, в порядке поиска. | type -a python3 |
-t |
type — вывести одно слово (alias/keyword/function/builtin/file). | type -t cd |
-b |
whereis — искать только бинарный файл, пропустив man и исходники. | whereis -b nginx |
-p |
type — вывести путь к файлу, только если это внешняя команда. | type -p python3 |
Ничего не найдено. Попробуй запрос короче.
Проверка «есть ли команда» в скрипте (надёжно):
which нашёл, а команда «not found» (или наоборот)which не знает про alias/builtin/функции и читает свой $PATH, который может
отличаться от текущего. Доверяй type — он спрашивает саму оболочку.
type -a имя покажет все совпадения по PATH в порядке поиска — первое и выполнится.
Поправь порядок в $PATH или зови по полному пути.
command not found хотя пакет установленБинарь не в $PATH (часто /usr/local/sbin, ~/.local/bin). Проверь echo $PATH
и whereis имя — см. env-vars.
Bash кэширует найденный путь к команде в таблице хэшей на время сессии.
Установка новой версии рядом со старой (или через другой менеджер пакетов)
не сбрасывает этот кэш автоматически: hash -r заставляет bash искать заново
по $PATH, hash -t имя показывает, что сейчас закэшировано.
Есть неточность? Сообщить об ошибке в статье