which仅在$path中搜索首个可执行文件路径,反映实际执行版本;whereis则固定扫描系统预设目录,返回二进制、手册页、源码三类路径,用于识别是否为标准系统命令。

Linux 中的 whereis 和 which 都能查命令路径,但它们定位逻辑不同,配合使用就能快速区分系统内置命令和第三方安装的软件资源。
which 专找“正在执行”的可执行文件
它只在 $PATH 环境变量列出的目录中按顺序搜索,返回第一个匹配的可执行文件路径。这个结果直接反映当前 shell 执行该命令时实际调用的是哪一个版本。
- 例如:
which python3返回/usr/bin/python3,说明系统默认走的是发行版自带的 Python;若返回/opt/python312/bin/python3或~/.local/bin/python3,大概率是用户手动编译或通过 pyenv、asdf 等工具安装的第三方版本。 -
which -a可列出所有同名可执行文件(如系统版 + 用户版),方便对比优先级。 - 注意:
which对 Shell 内置命令(如cd、echo)无效,它查不到——这类命令不占磁盘路径,而是由 shell 自己实现的。
whereis 定位“配套资源”的标准位置
whereis 不依赖 PATH,而是固定扫描系统预设目录(如 /bin、/usr/bin、/usr/share/man、/usr/src),返回二进制、手册页、源码三类路径(默认全显示)。
- 例如:
whereis ls输出ls: /bin/ls /usr/share/man/man1/ls.1.gz,说明这是典型的系统内置命令:二进制在/bin(POSIX 标准路径),手册在标准 man 目录。 - 而对第三方软件(如自己编译安装的
nginx),whereis nginx很可能只返回nginx:(空),因为它没被放进系统预设目录,whereis就搜不到——这本身就是一个线索:不在标准位置,大概率非系统包管理器安装。 - 用
whereis -b单独查二进制,再和which结果比对:如果两者路径一致且位于/usr/bin或/bin,基本可判定为系统内置;如果which指向/usr/local/bin或/opt/xxx,而whereis -b查无结果,则属于第三方部署。
结合判断的实用技巧
单靠一个命令容易误判,组合使用更可靠:
- 先运行
which 命令名,拿到当前执行路径; - 再运行
whereis -b 命令名,看是否命中系统标准路径; - 如果
which路径在/bin、/sbin、/usr/bin、/usr/sbin中,且whereis也能查到对应项,基本是系统包(如 apt/yum 安装); - 如果
which路径在/usr/local/bin、/opt/、~/.local/bin等非标位置,且whereis无输出或仅返回手册页(whereis -m有,-b无),就是第三方来源。
补充验证方式
当仍不确定时,可用这些命令辅助确认:
-
dpkg -S $(which command)(Debian/Ubuntu)或rpm -qf $(which command)(RHEL/CentOS):反查该文件属于哪个系统软件包; -
type -a command:不仅能显示可执行路径,还能识别别名、函数、内置命令,比which更全面; -
ls -l $(which command):看文件属主和权限,系统包通常属 root,第三方安装常属普通用户。











