如何知道准确和完整的 Linux whereis 命令搜索路径

如何知道准确和完整的 Linux whereis 命令搜索路径

阅读我的 Debian ‘wheezy’ Linux 上有关“whereis”命令的手册页,它显示感兴趣的文件是:

文件
   /{bin,sbin等}

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

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

我认为这些是硬编码的搜索路径,但为什么我会得到这样的结果:

root@kali:/bin# gnome 在哪里
gnome:/usr/share/gnome
root@kali:/bin#

为什么会显示这个?因为它不在假定的路径上?

...而且它是一个目录,而不是二进制、源或手册。

答案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
};

来源

答案2

我最好的主意是研究一下源代码

定义了三个静态数组,一个用于二进制搜索路径,一个用于手册页,一个用于源代码。它们包括以下目录(如上文所述,已硬编码)错误手册页部分,或者分别使用命令行选项、、、-B进行调整)——取自版本 2.23:-M-S

  • 二进制搜索路径

    "/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发现一切作为指定文件夹中的二进制文件,甚至是不可执行(空)文件:

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

这样做的目的是什么——我不知道。但总的来说,我认为whereis有点过时了。要查找可执行文件,shell 内置命令where -a [command]更合适。

相关内容