阅读我的 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]
更合适。