Гид по технологиям

Команда which в Linux: как найти исполняемый файл

5 min read Linux Обновлено 01 Dec 2025
which в Linux: найти путь исполняемого файла
which в Linux: найти путь исполняемого файла

Иллюстрация: вывод which и расположение исполняемых файлов в PATH

Linux даёт полный контроль над рабочей средой, но порой нужно быстро понять, какая именно программа будет запущена. Команда which помогает найти точное местоположение исполняемого файла, просматривая каталоги, перечисленные в переменной окружения $PATH. В этой статье мы подробно разберём синтаксис, параметры, примеры реального использования, ограничения which и безопасные альтернативы.

Что делает команда which

which проверяет, какой исполняемый файл соответствует заданному имени команды, просматривая каталоги из $PATH в порядке их перечисления. По умолчанию which возвращает первый найденный путь. Это полезно, когда в системе установлено несколько версий одного и того же инструмента.

Кратко об кодах завершения (exit codes):

  • 0 — все указанные команды найдены и доступны для выполнения.
  • 1 — одна или несколько команд не найдены или недоступны для выполнения.
  • 2 — использована неверная опция.

Синтаксис

Используйте which так:

which [опции] имя_команды [имя_команды ...]

Например:

which grep
which awk sed cat
which -a python

Если необходимо найти все совпадения — добавьте опцию -a.

Почему which полезен

  • Быстро показывает, какая бинарная программа будет запущена.
  • Помогает обнаружить конфликты версий (когда существуют несколько копий одного инструмента).
  • Указывает, если команда отсутствует в $PATH.
  • Полезен при отладке скриптов и настройке окружения.

Примеры использования

Найти путь к исполняемому файлу

which grep

Ожидаемый вывод: путь вроде /usr/bin/grep.

Найти пути для нескольких команд

which awk sed cat

Каждая команда возвращает свой путь в отдельной строке, если найдено.

Показать все найденные экземпляры

По умолчанию which возвращает только первый матч. Чтобы увидеть все совпадения, используйте -a:

which -a cat

Это может вывести, например, /bin/cat и /usr/bin/cat.

Чтобы сравнить файлы и их размеры:

ls -lh /usr/bin/cat && ls -lh /bin/cat

Если оба файла совпадают по размеру и правам — возможно, это дублирующие исполняемые файлы или один из них символическая ссылка.

Проверить существование команды

Если команда не найдена, which просто не выводит строку и возвращает ненулевой код завершения:

which some_nonexistent_command
echo $?

Если which ничего не нашёл, значение переменной $? будет равно 1.

Определить символические ссылки

Чтобы увидеть все экземпляры и затем проверить, какие из них являются символическими ссылками:

which -a crontab
ls -lh /usr/bin/crontab && ls -lh /bin/crontab

Если в выводе ls встречается ->, значит файл — символическая ссылка, указывающая на другой путь.

Исключение встроенных команд оболочки

which показывает только внешние исполняемые файлы. Встроенные команды оболочки (builtins) типа cd или read which не отобразит. Пример:

which ls read

Вы увидите путь для ls, а read не будет показан (потому что это встроенная команда в большинстве оболочек).

Ограничения which

Хотя which полезен, у него есть ограничения:

  • Не показывает встроенные команды оболочки.
  • Не всегда различает бинарник и символическую ссылку (нужно дополнительно смотреть ls -l).
  • Ищет только в каталогах, указанных в $PATH, поэтому исполняемые файлы вне PATH не найдёт.
  • Не выводит подробной информации о файле (типа, прав, версий).
  • При отсутствии команды вывод отсутствует вместо явного сообщения об ошибке.

Важно: which — диагностический инструмент. Для принятия решений в скриптах лучше использовать более надёжные средства, которые учитывают поведение текущей оболочки.

Альтернативы и когда использовать каждую

  • type <имя> — даёт информацию о том, является ли объект встроенной командой, функцией, алиасом или внешним исполняемым файлом. Рекомендуется для интерактивной диагностики.
type ls
  • command -v <имя> — POSIX-совместимый способ узнать, что будет выполнено; удобен в скриптах.
command -v python
  • whereis <имя> — ищет двоичные файлы, исходники и man-страницы в стандартных системных путях; полезен для быстрой общей локации.
whereis gcc
  • which -a — если нужно увидеть все экземпляры в $PATH.

Выбор:

  • Для скриптов: используйте command -v или type -P (если доступно).
  • Для быстрой интерактивной проверки: which или type.
  • Для поиска исходников и man-страниц: whereis.

Практические рекомендации

  • Если вы видите неожиданный путь для команды, проверьте $PATH и порядок каталогов.
  • Для установки предпочтительной версии добавьте нужный каталог в начало $PATH.
  • Чтобы убедиться, что скрипт запускает именно внешнюю команду, используйте command -v в скриптах и обработку кода возврата.

Important: Не полагайтесь на which для различения встроенных команд и алиасов. Для этого используйте type.

Чеклист по ролям

  • Для разработчиков:

    • Проверьте command -v node перед установкой зависимостей.
    • Убедитесь, что в CI окружение содержит ожидаемый $PATH.
  • Для администраторов:

    • Используйте which -a при диагностике конфликтов версий.
    • Проверьте права и символьные ссылки через ls -l.
  • Для SRE/операций:

    • В скриптах используйте command -v и обрабатывайте нечёткие ситуации (exit codes).
    • Документируйте изменения в $PATH для инцидентов.

Шпаргалка — команды и примеры

# Найти первую встречающуюся программу
which python3

# Показать все совпадения в $PATH
which -a python3

# POSIX-совместимая проверка (лучше для скриптов)
command -v python3

# Уточнить, что именно представляет команда (builtin, alias, file)
type ls

# Найти бинарники, исходники и man-страницы
whereis gcc

# Сравнить файлы по правам и размеру
ls -lh /usr/bin/cat && ls -lh /bin/cat

Диаграмма принятия решения

flowchart TD
  A[Нужно узнать, какая команда запустится?] --> B{Используется в скрипте?}
  B -- Да --> C[Используйте command -v или type -P]
  B -- Нет --> D{Нужны все совпадения?}
  D -- Да --> E[which -a]
  D -- Нет --> F[which]
  C --> G[Проверьте exit code и PATH]
  E --> G
  F --> G

Краткая методология проверки (мини-процедура)

  1. Выполните which -a <имя> чтобы увидеть все копии.
  2. Выполните type <имя> чтобы узнать, builtin это или alias.
  3. Проверьте файлы команд через ls -lh и readlink -f, чтобы понять реальные пути и ссылки.
  4. При необходимости измените $PATH или права доступа.

1‑строчный глоссарий

  • $PATH — переменная окружения, содержащая список директорий, где оболочка ищет исполняемые файлы.
  • исполняемый файл — файл с установленным битом выполнения и подходящим форматом (ELF, скрипт с шебангом и т. д.).
  • символическая ссылка — файл, который указывает на другой путь.
  • builtin — встроенная команда оболочки, не находящаяся в файловой системе как отдельный бинарник.

Критерии приёмки

  • Команда возвращает ожидаемый путь для известных инструментов (например, /usr/bin/grep).
  • Для отсутствующих команд which не выводит результат и возвращает код 1.
  • Для проверки встроенных команд используйте type и получите соответствующую индикацию.

Когда which не подойдёт и что делать

  • Если нужно узнать, является ли команда встроенной — используйте type.
  • Если требуется полная информация о местоположении исходников и man — используйте whereis.
  • Для скриптов и кросс-совместимости используйте command -v.

Итог

which — простой и практичный инструмент для быстрого поиска исполняемых файлов в $PATH. Он удобен при интерактивной работе и базовой диагностике. Однако у which есть ограничения: он не показывает встроенные команды, не даёт подробной информации о файле и может пропустить экземпляры вне $PATH. Для надёжных проверок в скриптах и расширённой диагностики используйте command -v, type и whereis.

Рекомендуемые шаги: сначала выполните which -a для общей картины, затем type и ls -lh/readlink -f для подтверждения и анализа.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Ярлыки для UWP‑приложений в Windows 11
Windows

Ярлыки для UWP‑приложений в Windows 11

Серийный номер жёсткого диска в Windows 10
Windows

Серийный номер жёсткого диска в Windows 10

PIN в Windows 10: настройка и безопасность
Windows

PIN в Windows 10: настройка и безопасность

Организация контактов на Android
Android.

Организация контактов на Android

Быстрый запуск MySQL в Docker
DevOps

Быстрый запуск MySQL в Docker

Виджет «Новости и интересы» в Windows 10
Windows

Виджет «Новости и интересы» в Windows 10