С чего начать Первые шаги трек · 15 ступеней
Linux Labs

which / type / whereis — где команда

3 мин bash

Найти, какой бинарь выполнится, builtin это или alias, где лежит и man к нему.

Шпаргалка

4 команды Версия для печати
  • 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-страницу.

Ключи

5

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

Ничего не найдено. Попробуй запрос короче.

Рецепты

1

Примеры

bash
type ls               # ls is aliased to `ls --color=auto`  (видит alias!)
type -a python3       # ВСЕ варианты по PATH (где ещё лежит)
type cd               # cd is a shell builtin
command -v git        # /usr/bin/git  (или пусто + код возврата 1, если нет)
which python3         # /usr/bin/python3
whereis nginx         # nginx: /usr/sbin/nginx /etc/nginx /usr/share/man/...

Проверка «есть ли команда» в скрипте (надёжно):

bash
if command -v docker >/dev/null 2>&1; then
  echo "docker есть"
fi

Неполадки

4

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 имя показывает, что сейчас закэшировано.

См. также

  • env-vars — env, export, $PATH, ~/.bashrc vs профили; почему «command not found».
  • man-help — Как быстро узнать опции команды — man, --help, apropos, tldr.
  • alias — Короткие имена для длинных команд; временно и навсегда через ~/.bashrc; почему alias не виден в скриптах.
Загрузка…