Поиск по сайту:

Как использовать команду which в Linux


Команда Linux what идентифицирует исполняемый двоичный файл, который запускается, когда вы вводите команду в оболочку. Если на вашем компьютере установлены разные версии одной и той же программы, вы можете использовать what, чтобы узнать, какую из них будет использовать оболочка.

Двоичные файлы и пути

Когда вы пытаетесь запустить программу или команду из окна терминала, оболочка (обычно Bash в современных дистрибутивах) должна найти эту команду и запустить ее. Некоторые команды, такие как cd, history и pwd, встроены в оболочку, поэтому Bash не нужно слишком много работать, чтобы найти их.

Но как Bash находит другие команды, программы и внешние автономные двоичные файлы? Ну, Bash использует путь, который на самом деле представляет собой набор путей, каждый из которых указывает на каталог. Затем он ищет в каждом из этих каталогов исполняемый файл, соответствующий команде или программе, которую вы пытаетесь запустить. Когда он находит его, Bash запускает его и прекращает поиск.

Вы можете использовать echo, чтобы проверить переменную среды PATH и просмотреть каталоги на вашем пути. Для этого введите следующее и нажмите Enter:

echo $PATH

В выходном списке каждый путь разделяется двоеточием (:). На компьютере, который мы используем, Bash будет искать следующие каталоги в следующем порядке:

  •  /usr/local/sbin
  •  /usr/local/bin
  •  /usr/sbin
  •  /usr/bin
  •  /sbin
  •  /bin
  •  /user/games
  •  /usr/local/games
  •  /snap/bin

В файловой системе есть много папок с именами /sbin и /bin, что может привести к некоторой путанице.

Смотри на эти пути

Допустим, у нас есть обновленная версия программы под названием htg. Он находится в нашем текущем каталоге, и мы можем запустить его, введя следующую команду:

./htg 

Это не большая программа — она просто печатает номер версии, а затем закрывается. Новая версия 1.2.138.

Чтобы запустить программу в текущем рабочем каталоге, вы должны ввести «./» перед названием программы, чтобы Bash знал, где ее найти.

Поскольку мы хотим запускать эту конкретную программу из любого каталога, мы собираемся переместить исполняемый файл в каталог /usr/bin. Bash найдет эту программу в пути и запустит ее для нас.

Нам не нужен исполняемый файл в нашем текущем каталоге, и нам не нужно вводить «./» перед именем программы, как показано ниже:

sudo mv htg /usr/bin

Теперь давайте попробуем запустить программу, набрав:

htg

Что-то работает, но это не наша новая, обновленная программа. Вернее, это более старая версия, 1.2.105.

Какая команда

Проблема, которую мы продемонстрировали выше, заключается в том, почему была разработана команда what.

В этом примере мы будем использовать what и передадим имя исследуемой программы в качестве параметра командной строки:

which htg

который сообщает, что он нашел версию htg в каталоге /usr/local/bin. Поскольку это расположение указано в пути перед каталогом, в который мы переместили обновленный htg, Bash использует эту более раннюю версию программы.

Однако, если мы используем параметр -a (все), как показано ниже, который продолжает поиск, даже если находит совпадение:

which -a htg

Затем он перечисляет все совпадения в любом из каталогов пути.

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

Для проверки мы можем ввести следующее и явно запустить каждую версию программы:

/usr/local/bin/htg
/usr/bin/htg

Это объясняет проблему, и решение простое.

На самом деле, у нас есть варианты. Мы можем либо удалить старую версию в каталоге /use/local/bin, либо переместить ее из /usr/bin в /usr/local/bin.

Смотреть эти результаты

Два результата не обязательно означают два бинарных файла.

Давайте рассмотрим пример, в котором мы будем использовать команду what с параметром -a (все) и искать версии less программа:

which -a less

который сообщает о двух местах, где находится версия программы less, но так ли это? Было бы странно иметь две разные версии (или одну и ту же версию в разных местах) less, установленные на компьютере с Linux. Итак, мы не собираемся принимать вывод what. Вместо этого давайте копнем немного глубже.

Мы можем использовать параметры ls-l (длинный список) и -h (удобочитаемый), чтобы увидеть, что происходит:

ls -lh /usr/bin/less

Размер файла сообщается как девять байт! Это определенно не полная копия less.

Первый символ в списке — «л». Обычный файл будет иметь дефис (-) в качестве первого символа. Символ «l» означает символическую ссылку. Если вы пропустили эту деталь, символ --> также указывает, что это символическая ссылка, которую вы можете рассматривать как своего рода ярлык. Этот указывает на копию less в /bin.

Давайте попробуем еще раз с версией less в /bin:

ls -lh /bin/less

Эта запись, очевидно, является «настоящим» бинарным исполняемым файлом. Первый символ в списке — дефис (-), что означает, что это обычный файл, а размер файла — 167 КБ. Итак, установлена только одна копия less , но на нее есть символическая ссылка из другого каталога, которую Bash также находит при поиске пути.

Проверка нескольких команд одновременно

Вы можете передать несколько программ и команд what, и он проверит их по порядку.

Например, если вы наберете:

which ping cat uptime date head

который работает со списком программ и команд, которые вы ему предоставили, и выводит результат для каждой из них.

Какой какой?

Если вы так склонны, вы также можете использовать what сам по себе, набрав следующее:

which which

Если не считать любопытства в файловой системе Linux, который наиболее полезен, когда вы ожидаете от команды или программы одного набора действий, а получаете другой.

В этих случаях вы можете использовать what, чтобы убедиться, что запускаемая Bash команда является именно той, которую вы хотите использовать.

RELATED: Best Linux Laptops for Developers and Enthusiasts