При выполнении whereis apt
я получаю набор результатов, который выглядит следующим образом:
apt: /usr/bin/apt /usr/lib/apt /etc/apt /usr/share/man/man8/apt.8.gz
Когда я затем запускаю which apt
, я получаю
/usr/bin/apt
, который является первым результатом команды выше. Я прочитал здесь , что это не совпадение, и оно связано с переменной $PATH
. Поэтому я запустил echo $PATH
и получил:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Затем я коснулся файла с именем apt
в /bin
и снова запустил which apt
- без изменений, хотя whereis apt
изменилось на:
apt: /usr/bin/apt /usr/lib/apt /bin/apt /etc/apt /usr/share/man/man8/apt.8.gz
Это привело меня к выводу, что среда $PATH
может быть не все? Может кто-то пролить свет на эту проблему? Откуда whereis
получает информацию?
Я не совсем уверен, спрашиваете ли Вы о whereis
или which
, таким образом, я просто собираюсь обратиться к обоим.
whereis
whereis
определяет местоположение двоичного файла, источника и ручных файлов для указанных названий команды. (…) [Это] пытается определить местоположение желаемой программы в стандартных местах Linux, и в местах, указанных$PATH
и$MANPATH
.
(…)
Самый легкий способ знать, какие пути используются, состоит в том, чтобы добавить-l
список опции.
Источник:man whereis
Выполненный whereis -l
получить список путей использование программы. По умолчанию это ищет двоичный файл, источник и ручные файлы, можно изменить то поведение с -b
, -s
и -m
опции, например.
$ whereis -m apt
apt: /usr/share/man/man8/apt.8.gz
$ whereis -b apt
apt: /usr/bin/apt /usr/lib/apt /etc/apt
В отличие от этого, which
(см. ниже), whereis
не тестирует, является ли файл исполняемым файлом при поиске двоичных файлов, вот почему touch /bin/apt
изменяет его вывод.
which
which
возвращает пути (…) путем поиска ПУТИ исполняемые файлы, соответствующие названиям аргументов.
Источник:man which
which
делаетЯ беру его which
делает по существу то же как это find
команда:
IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "SEARCH"
Это ищет каждый каталог, существующий в PATH
для названных исполняемых файлов SEARCH
, например, для apt
:
$ which apt
/usr/bin/apt
$ IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "apt"
/usr/bin/apt
По умолчанию which
только печатает первое соответствие от PATH
каталоги, т.е. файл, который выполняется. С touch /bin/apt
Вы действительно создавали файл, соответствующий ограничению имени, но Вы забыли делать его исполняемым файлом, и Вы не вышли which
производить a
соответствия ll. Давайте попробуем это снова:
$ touch /bin/apt
$ chmod +x /bin/apt
$ which -a apt
/usr/bin/apt
/bin/apt
$ IFS=':'; find $PATH -mindepth 1 -maxdepth 1 -type f -executable -name "apt"
/usr/bin/apt
/bin/apt