Как упорядочить результаты?

При выполнении 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 получает информацию?

3
задан 8 January 2018 в 11:29

1 ответ

Я не совсем уверен, спрашиваете ли Вы о 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
5
ответ дан 1 December 2019 в 15:33

Другие вопросы по тегам:

Похожие вопросы: