2

Читая справочные страницы о команде whereis в моем linux-Debian 'wheezy', он показывает, что интересующий файл:

FILES
   /{bin,sbin,etc}

   /usr/{lib,bin,old,new,local,games,include,etc,src,man,sbin,
                           X386,TeX,g++-include}

       /usr/local/{X386,TeX,X11,include,lib,man,etc,bin,games,emacs}

Я предполагаю, что это жестко заданные пути поиска, но почему я получаю это:

root@kali:/bin# whereis gnome
gnome: /usr/share/gnome
root@kali:/bin#

Почему это показывает? Так как это не на предполагаемом пути?

... и более того, это каталог, а не двоичный файл, источник или руководство.

2 ответа2

1

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

static const char *bindirs[] = {
    "/usr/bin",
    "/usr/sbin",
    "/usr/lib",
    "/usr/lib64",
    "/bin",
    "/sbin",
    "/etc",
    "/usr/etc",
    "/lib",
    "/lib64",
    "/usr/games",
    "/usr/games/bin",
    "/usr/games/lib",
    "/usr/emacs/etc",
    "/usr/lib/emacs/*/etc",
    "/usr/TeX/bin",
    "/usr/tex/bin",
    "/usr/interviews/bin/LINUX",

    "/usr/X11R6/bin",
    "/usr/X386/bin",
    "/usr/bin/X11",
    "/usr/X11/bin",
    "/usr/X11R5/bin",

    "/usr/local/bin",
    "/usr/local/sbin",
    "/usr/local/etc",
    "/usr/local/lib",
    "/usr/local/games",
    "/usr/local/games/bin",
    "/usr/local/emacs/etc",
    "/usr/local/TeX/bin",
    "/usr/local/tex/bin",
    "/usr/local/bin/X11",

    "/usr/contrib",
    "/usr/hosts",
    "/usr/include",

    "/usr/g++-include",

    "/usr/ucb",
    "/usr/old",
    "/usr/new",
    "/usr/local",
    "/usr/libexec",
    "/usr/share",

    "/opt/*/bin",
    NULL
};

static const char *mandirs[] = {
    "/usr/man/*",
    "/usr/share/man/*",
    "/usr/X386/man/*",
    "/usr/X11/man/*",
    "/usr/TeX/man/*",
    "/usr/interviews/man/mann",
    NULL
};

static const char *srcdirs[] = {
    "/usr/src/*",
    "/usr/src/lib/libc/*",
    "/usr/src/lib/libc/net/*",
    "/usr/src/ucb/pascal",
    "/usr/src/ucb/pascal/utilities",
    "/usr/src/undoc",
    NULL
};

Источник

0

Лучшая идея, которая у меня есть, - заглянуть в исходный код.

Определены три статических массива: один для двоичного пути поиска, один для справочных страниц и один для источников. Они включают в себя следующие каталоги (жестко закодированные, как упомянуто в разделе BUGS на странице руководства, oder настраивается с помощью параметров командной строки -B , -M , -S и т.д.), Взятые из версии 2.23:

  • двоичный путь поиска

    "/usr/bin",
    "/usr/sbin",
    "/usr/lib",
    "/usr/lib64",
    "/bin",
    "/sbin",
    "/etc",
    "/usr/etc",
    "/lib",
    "/lib64",
    "/usr/games",
    "/usr/games/bin",
    "/usr/games/lib",
    "/usr/emacs/etc",
    "/usr/lib/emacs/*/etc",
    "/usr/TeX/bin",
    "/usr/tex/bin",
    "/usr/interviews/bin/LINUX",
    "/usr/X11R6/bin",
    "/usr/X386/bin",
    "/usr/bin/X11",
    "/usr/X11/bin",
    "/usr/X11R5/bin",
    "/usr/local/bin",
    "/usr/local/sbin",
    "/usr/local/etc",
    "/usr/local/lib",
    "/usr/local/games",
    "/usr/local/games/bin",
    "/usr/local/emacs/etc",
    "/usr/local/TeX/bin",
    "/usr/local/tex/bin",
    "/usr/local/bin/X11",
    "/usr/contrib",
    "/usr/hosts",
    "/usr/include",
    "/usr/g++-include",
    "/usr/ucb",
    "/usr/old",
    "/usr/new",
    "/usr/local",
    "/usr/libexec",
    "/usr/share",
    "/opt/*/bin"
    
  • путь поиска страницы руководства

    "/usr/man/*",
    "/usr/share/man/*",
    "/usr/X386/man/*",
    "/usr/X11/man/*",
    "/usr/TeX/man/*",
    "/usr/interviews/man/mann"
    
  • исходный путь поиска

    "/usr/src/*",
    "/usr/src/lib/libc/*",
    "/usr/src/lib/libc/net/*",
    "/usr/src/ucb/pascal",
    "/usr/src/ucb/pascal/utilities",
    "/usr/src/undoc"
    

Кроме того, $PATH и $MANPATH также принимаются во внимание.

В последней части вашего вопроса, почему папки обнаруживаются как двоичные файлы, я предполагаю, что whereis находит все как двоичные в указанных папках, даже _un_executable (empty) файлы:

$ touch /usr/share/foo
$ whereis foo
foo: /usr/share/foo

Какова цель этого - я не знаю. Но в целом я думаю , что whereis немного устарела. Для поиска исполняемых файлов встроенная оболочка, where -a [command] гораздо более подходящая.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .