Вопрос или проблема
В чем разница между 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
:
- Автоматизация: В сценариях, где нужно быстро проверить наличие и расположение исполняемого файла, чтобы избежать рисков использования нежелательных версий команд.
- Отладка: Проверка того, какая версия команды будет запускаться по умолчанию, особенно если в системе установлено несколько версий.
Когда использовать whereis
:
- Исследование: Для более глубокого анализа, например, при установке нового ПО и необходимости проверки иммутабильности системы.
- Документация: Быстрый поиск man-страниц, особенно при изучении новой команды или обновлении знаний.
Контекст и особенности
На системах macOS, например, whereis
может представлять собой менее полезный инструмент по сравнению с which
, так как Apple имеет ограничения на изменение путей поиска. В некоторых версиях macOS, whereis
может предоставлять информацию только о давно устаревших утилитах. Этот контекст важен учесть при выборе между этими командами для использования на различных системах.
Заключение
И which
, и whereis
являются полезными инструментами для администрирования систем, но их применение зависит от конкретных задач, стоящих перед пользователем. which
лучше всего подходит для определения того, какая команда фактически будет выполнена, а whereis
полезен для получения полного представления о связанных файлах. Выбор правильной команды может существенно упросить процессы отладки и автоматизации, обеспечивая значительную экономию времени и повышение эффективности.