which只查path中首个可执行文件,whereis查预建数据库中的二进制、man、源码路径;前者用于确定实际执行命令,后者适合找手册位置。

which 和 whereis 都能查路径,但它们查的不是一回事——用错一个,就可能拿不到你真正想要的信息。
which 只认 PATH,且只返回第一个可执行文件
它干的事很专一:顺着 PATH 环境变量从左到右扫目录,找到第一个名字匹配的可执行文件就停。不看手册页、不看源码、不关心有没有同名非可执行文件。
- 适合脚本中判断命令是否存在:
if [ -x "$(which curl)" ]; then ... - 排查别名或 shell 函数干扰:
which ls能告诉你实际执行的是/bin/ls还是被 alias 覆盖了 -
which -a python可列出 PATH 中所有python可执行文件(不止第一个) - 注意:如果当前 shell 有函数定义叫
foo,which foo不会提示“这是函数”,而是静默失败(返回空)
whereis 默认查三类路径:二进制、man 手册、源码
它不依赖 PATH,而是查系统预建的数据库(通常由 updatedb 维护),固定扫描 /usr/bin、/usr/share/man、/usr/src 等标准位置。
-
whereis gcc可能输出:gcc: /usr/bin/gcc /usr/lib/gcc /usr/share/man/man1/gcc.1.gz - 加参数可限定范围:
whereis -b python只查二进制;whereis -m python只查 man 手册路径 - 数据库不是实时更新:刚
apt install的新命令,whereis可能搜不到,需手动运行sudo updatedb - 没输出基本等于没安装(而
which空输出可能是PATH没配对)
常见误用场景与排查建议
当你发现 which python3 返回路径,但 whereis python3 什么都没返回,大概率是这个 python3 是你自己编译装在 /opt/python3 这种非标准路径下的——whereis 的数据库压根不扫那里。
- 想确认「敲命令时到底执行谁」→ 无条件用
which - 想快速找某个命令的 man 文档位置(比如直接
man /usr/share/man/man1/git.1.gz)→ 用whereis -m git - 两者结果不一致?先检查
echo $PATH,再确认是否刚装完软件还没更新数据库 - 需要绝对可靠、绕过所有缓存和别名 → 直接上
find /usr -name python3 -type f -executable 2>/dev/null(慢但准)
真正容易被忽略的点是:whereis 查到的路径里,有些根本不是可执行文件(比如 /etc/passwd 也会被列出来),别直接当成 which 的替代品去执行。










