
一、什么是whereis命令
whereis 命令主要用于定位指定命令名的二进制文件、源代码文件和手册页文件。它并不是一个全盘搜索工具,而是基于一组预定义的、标准的 Linux 目录路径进行查找,效率很高。
你可以通过 man whereis 或访问其在线手册页 (https://man.he.net/man1/whereis) 来获取最官方的定义与说明。
它的工作原理是:首先去除你所提供名称中的前导路径部分,然后尝试在硬编码的标准 Linux 位置,以及由 $PATH 和 $MANPATH 环境变量指定的位置中查找目标程序。
whereis 的一个关键特性是其搜索限制选项(-b、-m、-s)具有累积性,并且作用于命令行中后续的所有名称,直到遇到新的限制选项。例如:
whereis -bm ls tr -m gcc
这行命令表示:查找 “ls” 和 “tr” 命令的二进制文件和手册页,但只查找 “gcc” 命令的手册页。
而 -B、-M、-S 选项则用于为后续要查找的命令重置或指定特定的搜索路径。例如:
whereis -m ls -M /usr/share/man/man1 -f cal
这表示:在所有默认路径中查找 “ls” 的手册页,但仅在 /usr/share/man/man1 目录中查找 “cal” 的手册页。这里 -f 选项的作用是终止前一个路径列表(-M 指定的路径),并告诉 whereis 接下来 “cal” 是要查找的文件名。
二、文件搜索路径与参数选项
默认情况下,whereis 会从一个硬编码的路径列表中查找文件。它也会参考 $PATH 和 $MANPATH 这两个环境变量的值。如果你想查看当前系统上 whereis 具体会搜索哪些路径,最简单的方法是使用 -l(列出)选项:
[root@master1 ~]# whereis -h
用法:
whereis [选项] 文件
选项:
-b 只搜索二进制文件
-B <目录> 定义二进制文件查找路径
-m 只搜索 man 手册
-M <目录> 定义 man 手册查找路径
-s 只搜索源代码
-S <目录> 定义源代码查找路径
-f 终止 <目录> 参数列表
-u 搜索不常见记录
-l 输出有效查找路径
更多信息请参阅 whereis(1)。
三、使用实例
1. 基本用法:查找命令的所有相关信息
直接使用 whereis 加命令名,它会返回该命令的二进制文件、手册页和源代码(如果存在)的路径。
注意:whereis 不会列出所有相关文件,比如配置文件。它只在预定义的路径中查找特定类型的文件。要查找配置文件,建议使用 find 命令或针对 RPM 包系统的 rpm -qc 命令。
[root@master1 ~]# whereis nginx
nginx: /usr/local/nginx
2. 只查找二进制文件(可执行程序)
使用 -b 选项可以限定只搜索二进制可执行文件。
[root@master1 ~]# whereis -b python
python: /usr/bin/python /usr/bin/python2.7 /usr/bin/python2.7-config /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7
3. 只查找手册页(man pages)
使用 -m 选项可以限定只搜索手册页文件。
[root@master1 ~]# whereis -m ls
ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
4. 只查找源代码
使用 -s 选项限定只搜索源代码。这通常对大多数基础系统命令无效,除非你额外安装了对应软件的源码包。
[root@master1 ~]# whereis -s bash
bash:[root@master1 ~]#
(输出为空,表示未找到 bash 的源代码)
5. 自定义搜索路径
你可以使用 -B、-M、-S 来指定特定的搜索目录,并用 -f 选项来分隔路径和要查找的文件名。
-M 指定手册页搜索路径为 /usr/local/man
-f 表示后面的是要查找的命令名(必须用它来分隔路径和文件名)
[root@master1 ~]# whereis -M /usr/local/man -f ls
ls: /usr/bin/ls
6. 查看 whereis 的默认搜索路径
如前所述,使用 -l 选项可以列出 whereis 命令在当前环境下会搜索的所有路径,这对于理解其行为范围和进行系统运维与测试中的路径排查很有帮助。
[root@master1 ~]# whereis -l
bin: /usr/bin
bin: /usr/sbin
bin: /usr/lib
bin: /usr/lib64
bin: /etc
bin: /usr/etc
bin: /usr/games
bin: /usr/local/bin
bin: /usr/local/sbin
bin: /opt/jdk1.8.0_351_arm/bin
bin: /opt/hbase-1.2.0/bin
bin: /usr/java/jdk1.8.0_131/bin
bin: /usr/java/jdk1.8.0_131/jre/bin
man: /usr/share/man/man0p
man: /usr/share/man/man1
man: /usr/share/man/uk
man: /usr/share/man/ca
man: /usr/share/man/overrides
man: /usr/share/man/en
src: /usr/src/debug
src: /usr/src/kernels
7. 查找“不常见”的记录
-u 选项用于搜索那些“不常见”的记录,即那些在标准搜索路径下,不是每个类型(二进制、手册、源代码)都至少有一个文件存在的命令。通常配合通配符 * 使用来扫描当前目录下的所有可能项。
[root@master1 ~]# whereis -u *
log: /usr/share/man/man3/log.3.gz /usr/share/man/man3p/log.3p.gz
log: /usr/share/man/man3/log.3.gz /usr/share/man/man3p/log.3p.gz
raw: /usr/bin/raw /usr/share/man/man3/raw.3x.gz /usr/share/man/man7/raw.7.gz /usr/share/man/man8/raw.8.gz
telnet: /usr/bin/telnet /usr/share/man/man1/telnet.1.gz
test: /usr/bin/test /opt/hbase-1.2.0/bin/test /usr/share/man/man1/test.1.gz /usr/share/man/man1p/test.1p.gz
time: /usr/bin/time /usr/include/time.h /usr/share/man/man1/time.1.gz /usr/share/man/man1p/time.1p.gz /usr/share/man/man2/time.2.gz /usr/share/man/man3p/time.3p.gz /usr/share/man/man7/time.7.gz /usr/share/man/mann/time.n.gz
8. 组合使用:同时查找多个命令并限制类型
这个例子演示了如何高效地一次性查找多个开发工具(gcc, make, curl)的二进制文件和手册页。
[root@master1 ~]# whereis -bm gcc make curl
gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz
make: /usr/bin/make /usr/share/man/man1/make.1.gz /usr/share/man/man1p/make.1p.gz
curl: /usr/bin/curl /usr/share/man/man1/curl.1.gz
四、补充信息
环境变量:
你可以设置 WHEREIS_DEBUG 环境变量来启用调试输出,这在深入学习计算机基础概念如环境变量与程序交互时可能有用。
WHEREIS_DEBUG=all
报告缺陷:
whereis 命令是 util-linux 软件包的一部分。如需提交 bug 报告,请使用其项目的 issue 跟踪地址:
https://github.com/karelzak/util-linux/issues
可用性:
util-linux 软件包可以从 Linux 内核归档网站下载:
https://www.kernel.org/pub/linux/utils/util-linux/
五、总结
whereis 是一个用于快速定位命令安装路径的实用工具。它特别适合在你需要知道一个命令的可执行文件具体在哪里,或者想查看其手册页的存储位置时使用。相较于 find 命令的全盘搜索,whereis 的查找速度更快,因为它基于有限的、已知的路径列表。掌握 whereis 及其选项,能让你在 Linux 网络与系统管理工作中更高效地定位和解决问题。
希望本文的详解与示例能帮助你更好地理解和使用 whereis 命令。如果你想了解更多 Linux 下的文件查找和比较工具,可以参考相关的技术文章。也欢迎你在技术社区,如 云栈社区 ,与更多的开发者和运维工程师交流心得。