В чём разница между «which» и «whereis»?

Вопрос или проблема

В чем разница между which и whereis?

Как насчет изучения whereis и which с использованием whatis?

$  whatis which
which                (1)  - показывает полный путь к (shell) командам

$  whatis whereis
whereis              (1)  - находит бинарные, исходные файлы и файлы с мануалами для команды

По сути, whereis ищет “возможно полезные” файлы, в то время как which ищет только исполняемые файлы.

Я редко использую whereis. С другой стороны, which очень полезен, особенно в скриптах. which отвечает на следующий вопрос: Откуда берется эта команда?

$  which ls
/bin/ls

$  whereis ls
ls: /bin/ls /usr/share/man/man1p/ls.1p.bz2 /usr/share/man/man1/ls.1.bz2

whereis ищет в стандартных *nix местах заданную команду.

which ищет в пользовательском PATH (который может включать некоторые из мест, где ищет whereis, и может не включать другие – он также может включать некоторые места, которые whereis не ищет, если вы добавили их в свой PATH)

Цитируя их руководства :

whereis :

whereis находит исходные/бинарные файлы и
разделы мануалов для указанных файлов.

Например :

$ whereis php
php: /usr/bin/php /usr/share/php /usr/share/man/man1/php.1.gz

то есть, исполняемый файл “php” и некоторые другие вещи (например, страницы мануалов).

и which :

which возвращает пути к файлам,
которые будут выполнены в
текущей среде

Например :

$ which php
/usr/bin/php

то есть, только исполняемый файл “php”.

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

$ which ls
/bin/ls
$ which ifconfig
$ # Выходные данные отсутствуют, так как ifconfig существует только в PATH пользователя root.

whereis ищет исполняемые файлы, исходные файлы и страницы мануалов, используя базу данных, создаваемую автоматически системой.

$ whereis less
less: /bin/less /usr/bin/less /usr/bin/X11/less /usr/share/man/man1/less.1.gz

Но кажется, что whereis и locate не используют одну и ту же базу данных. Когда я установил программное обеспечение и сразу же использовал whereis и locate для его поиска, оказалось, что whereis смог найти некоторые файлы, связанные с этим программным обеспечением, а locate – нет. Они действительно используют разные базы данных? Как работает база данных? –Ну, как насчет отказаться от педантизма? 🙂

Думал, что поделюсь тем, что недавно узнал о своем Apple MacOS X Mojave; вполне уверен, что это относится к многочисленным версиям macOS Apple за последние несколько лет:

На macOS:

  • whereis ищет исполняемые файлы в пути, определенном строкой user.cs_path; далее определено как: /usr/bin:/bin:/usr/sbin:/sbin.

  • whereis также отображает расположение системной документации (т.е. man страницы) в некоторых случаях.

  • На некоторых системах sysctl может использоваться для “установки или получения состояния ядра”, но Apple отключила опцию -w, --write для изменения user.cs_path с помощью sysctl; другими словами, Apple убрала возможность исправления неправильной информации, выводимой whereis.

  • Таким образом, Apple направила whereis на отчет о местоположении (в основном) 10-20-летних инструментов, которые они предоставляют своим клиентам в user.cs_path.

  • Все это может сделать whereis Apple самой бесполезной утилитой на планете.

На случай, если вам интересно 🙂

В основном находит местоположение исполняемых файлов в переменной окружения PATH вашей системы.
Он сообщает, какой исполняемый файл будет запущен, когда вы вводите команду.

.

Ответ или решение

which и whereis — это две команды, используемые в операционных системах на основе Unix для поиска файлов и команд. Несмотря на то, что обе они используются для поиска файлов, у них разные цели и механизмы работы. Рассмотрим их подробнее.

Теория

Команда which

Команда which предназначена для поиска местоположения исполняемых файлов заданной команды в среде оболочки. Она осуществляет поиск в тех папках, которые указаны в переменной окружения PATH. Когда вы вводите команду в терминале, именно файл, найденный which, будет выполнен.

Особенности:

  • Ищет только исполняемые файлы.
  • Пользуется только переменной PATH, что делает её эффективной для определения, какой именно исполняемый файл будет использован в текущей сессии.
  • Не ищет файлы документации или исходные файлы.

Команда whereis

Команда whereis, с другой стороны, предназначена для поиска исполняемых файлов, исходного кода, а также файлов документации (например, man-страниц) для заданной команды. Она использует базу данных или стандартные каталогов Unix.

Особенности:

  • Ищет исполняемые файлы, исходники и man-страницы.
  • Не ограничивается переменной PATH и ищет в более широком спектре системных каталогов.
  • Полезна для быстрого поиска всех связанных файлов по ключевому слову.

Пример

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

$ which ls
/bin/ls

Команда which покажет только путь к исполняемому файлу в соответствии с вашей текущей средой PATH.

$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.bz2 /usr/share/man/man1p/ls.1p.bz2

Здесь whereis не только нашёл исполняемый файл, но также вывел местоположения соответствующих man-страниц.

Применение

Когда использовать which:

  1. Автоматизация: В сценариях, где нужно быстро проверить наличие и расположение исполняемого файла, чтобы избежать рисков использования нежелательных версий команд.
  2. Отладка: Проверка того, какая версия команды будет запускаться по умолчанию, особенно если в системе установлено несколько версий.

Когда использовать whereis:

  1. Исследование: Для более глубокого анализа, например, при установке нового ПО и необходимости проверки иммутабильности системы.
  2. Документация: Быстрый поиск man-страниц, особенно при изучении новой команды или обновлении знаний.

Контекст и особенности

На системах macOS, например, whereis может представлять собой менее полезный инструмент по сравнению с which, так как Apple имеет ограничения на изменение путей поиска. В некоторых версиях macOS, whereis может предоставлять информацию только о давно устаревших утилитах. Этот контекст важен учесть при выборе между этими командами для использования на различных системах.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...