新闻详情

新闻详情

首页 / 资讯中心 / 详情

Linux whereis命令完全指南:原理、参数与实战排坑

发布时间:2026/10/2 8:05:42来源:尧图网络
Linux whereis命令完全指南:原理、参数与实战排坑
前几天有同事拿着一个部署脚本问我他在检测 Nginx 安装路径时一会儿用which一会儿用whereis结果两个命令返回的路径对不上脚本直接崩了。说实话这场景我太熟了很多人在终端里敲了一两年 Linux天天用which、find、locate却一直没把whereis这个命令当回事。它看起来不起眼实际却是“命令关联文件查询”里最对症的一个工具一次返回命令的二进制文件、源代码文件和 man 手册页文件而且速度极快毫秒级出结果。如果你正在准备 Linux 面试、写运维脚本或者刚装完某个软件想搞明白它到底把文件都放到了哪里这个命令值得花十分钟彻底学透。我会把它背后的工作原理、参数细节、实操场景和我踩过的坑都过一遍看完你基本就能在日常工作里顺手用起来了。1. 原理拆解whereis 并不是普通搜索命令1.1 它只回答一个核心问题命令的相关文件在哪你在终端里敲一个命令比如ls和它相关的文件其实不止一个至少包含三类真正能执行的二进制文件一般是/usr/bin/ls或者/bin/ls帮助手册 man page通常是/usr/share/man/man1/ls.1.gz如果系统带有配套源码可能还会出现在/usr/src这类目录下。whereis ls做的事就是一次性把这三类结果全部列出来。我再强调一次它只关心“命令相关文件”不是“所有包含关键字的文件”。很多人抱怨whereis不好用说找不到文件其实是因为把它当成find来用了理解错位了。这个定位决定了它的价值。碰到环境排查时你不仅要确认“命令能不能执行”往往还想知道“文档在哪个目录”“有没有附带源码”三个需求一条命令就能回答这是which或者其他工具做不到的。1.2 搜索机制标准目录表加 PATH 叠加whereis不需要像find那样递归遍历整个目录树。它自己维护了一张“默认搜索表”我习惯叫它白名单。你可以用whereis -l把这张表完整打出来一般会包含这几类路径二进制目录/usr/bin、/bin、/usr/sbin、/sbin、/usr/local/bin手册目录/usr/share/man、/usr/local/man、/usr/man源码目录/usr/src、/usr/local/src等。注意不同发行版默认的表略有区别但大体围绕系统标准布局展开。这里有个很重要的细节较新版本的 util-linux 中whereis除了扫描这些标准目录还会叠加当前 shell 的PATH环境变量。也就是说如果你把软件装在了/opt/tool/bin并且把这个目录加到了PATH新版whereis是有可能扫到的。老版本则只认自己的默认表扫不到很正常。网上关于“whereis 为什么查不到命令”的讨论特别多十有八九就是版本和发行版差异造成的。1.3 为什么它这么快whereis的核心动作是“查名单”不是“翻文件”。你要找nginx它就把nginx这个名字放进预置目录里逐一比对匹配到二进制就记一笔匹配到手册再记一笔全程不碰无关目录所以能毫秒级返回。打个比方find像在大型仓库里逐层货架翻找而whereis像前台拿着快递单号对照分配表查到后直接告诉你包裹在哪个区哪个架。省时省力的同时代价是它不认识不在分配表里的区域。1.4 边界在哪里要心里有数明确几个它做不到的事能帮你少走弯路不查普通数据文件和配置文件/etc/nginx/nginx.conf这类文件不归它管对 shell 别名和内建命令无能为力alias ll、cd这种只能交给type如果软件安装在完全自定义的目录下且没进 PATH新版不一定扫到需要手动用-B参数指定目录。理解这些边界你对whereis的预期就会变得非常合理不会产生“它怎么又找不到”的错觉。2. 参数详解五个核心选项彻底掌握2.1 基本调用格式速记whereis的格式很简单一句话就能记住whereis [选项] 文件名1 文件名2 ...注意这里传的是“文件名”不是“路径”。你不该写whereis /usr/bin/cp该写whereis cp。多个命令可以放在一起查结果会按照顺序逐条列出。这条规则在写脚本时尤其重要脚本里如果拿到的是完整路径要先用basename拆出文件名再传进去。2.2 -b、-m、-s三类文件按需过滤默认情况下三者全查。如果你只需要其中一种就用过滤选项-b只查二进制文件-m只查 man 手册页-s只查源码文件。三个选项可以组合比如whereis -bm curl就只关心二进制和手册。我平时写脚本时最常用-b因为脚本里只需要可执行文件的绝对路径不想被一堆 man 页面干扰。需要留意的是输出里只有二进制而没有任何 man 页面时不代表手册一定不存在可能只是它的手册路径不在默认搜索表里或者该命令的手册被放在了其他章节目录。2.3 -u帮你把“异常项”揪出来-u的含义是“只显示那些没有满足常规完整条目的项”。什么是常规完整条目一个正常安装的命令通常应该同时具备二进制和 man 手册如果某个命令只有二进制却没有对应的手册-u就会挑出来。一个很实用的批量查法是把它和/usr/bin/*组合使用whereis -u /usr/bin/*这条命令能批量找出“装过了但缺少 man 帮助文档”的命令。第一次跑你大概率会看到一批平时根本注意不到的“裸奔命令”。这个思路用在系统审计、文档整理、新环境验收上非常顺手。2.4 -B、-M、-S 自定义搜索目录以及必须交代的 -f这是whereis最容易被忽略的功能。默认目录查不到时可以手动指定搜索范围-B 目录列表指定二进制搜索目录-M 目录列表指定手册搜索目录-S 目录列表指定源码搜索目录。但这里面有一个非常容易踩的语法坑当你用了这些大写选项时后面的文件名列表必须用-f隔开。-f的作用是终止目录列表告诉命令“接下来是文件名了”。举个例子whereis -B /opt/custom/bin /usr/local/bin -f mytool意思是在/opt/custom/bin和/usr/local/bin里找mytool的二进制文件。如果不写-f命令会把mytool当成目录继续解析要么报错要么返回空结果。我第一次用的时候就栽在这上面折腾了半天才发现少写了一个-f。2.5 辅助选项-l、-h、-V-l用于列出默认搜索目录调试 environment 时非常有用。-h和-V分别是帮助和版本信息但不同发行版对这两个短选项的兼容性不太一样有的版本不支持-h会提示 invalid option。遇到这种情况改用whereis --help或whereis --version或者直接man whereis都没问题。3. 实战演示三个场景加一段面试考点3.1 场景一一次性体检基础命令假设你要确认一台新装的服务器上核心命令是否齐全手册是否也都装好了可以这样whereis ls cp mv rm cat grep awk sed tar在标准系统上输出大致长这样不同发行版略有差异ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz cp: /usr/bin/cp /usr/share/man/man1/cp.1.gz mv: /usr/bin/mv /usr/share/man/man1/mv.1.gz rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz awk: /usr/bin/awk /usr/share/man/man1/awk.1.gz sed: /usr/bin/sed /usr/share/man/man1/sed.1.gz tar: /usr/bin/tar /usr/share/man/man1/tar.1.gz一眼扫过去二进制都在手册也都在说明这套环境的基础命令安装得很完整。如果哪一行只有/usr/bin/xxx而没有.gz文档说明该命令的文档包没装最常见的原因是最小化安装时没勾选man-pages。3.2 场景二只想拿 man 手册路径写内部技术文档或者做离线帮助中心时我经常只关心手册文件位置。比如要确认git的手册都在哪whereis -m git输出会列出所有和git相关的 man 手册路径包括git.1.gz、gitattributes.5.gz等。这个结果可以直接用于脚本打包手册目录也可以用来做文档索引。如果没有-m过滤输出里会混进/usr/bin/git处理起来反而不方便。3.3 场景三给自定义安装的软件做定位我之前在/opt/myservice/bin下装过一个内部工具svcctl默认whereis svcctl半天没反应。这时用-B手动圈定目录whereis -B /opt/myservice/bin -f svcctl返回svcctl: /opt/myservice/bin/svcctl如果工具还自带了手册在/opt/myservice/man还可以一并指定whereis -B /opt/myservice/bin -M /opt/myservice/man -f svcctl这个组合能力让whereis在五花八门的自定义安装场景里也能派上用场。注意大写参数不能重复出现例如不能写成-B /a -B /b要把多个目录一次列全-B /a /b /c。3.4 面试官常问的几个 whereis 考点结合这几年看面试题的经验关于whereis的高频追问几乎集中在下面几个问题whereis和which有什么区别核心回答which只按PATH找第一个可执行文件whereis基于默认标准目录查找二进制、man 手册和源码三类关联文件新版还会叠加PATH。whereis的原理是什么核心回答不遍历全盘基于默认目录列表查询可以用-l查看表。为什么刚编译安装的命令whereis找不到核心回答自定义安装目录不在默认表用-B指定。shell 内建命令能查吗核心回答查不了得用type。这些点准备到位面试时被问到相关概念基本不会卡壳。4. 常见问题与排查明明有为什么查不到4.1 命令明明能用whereis 却返回空优先级最高的原因是“目录不在搜索列表里”。whereis的默认目录表不等于你的PATH。如果你是通过源码编译把命令手动放进了/usr/local/xxx而新版whereis又没覆盖到该目录它查不到很正常。排查分三步走第一步用which cmd看命令实际路径第二步用echo $PATH对比哪些目录是后加的第三步用whereis -B 实际目录 -f cmd手动测试如果这样能查到说明就是默认表的问题。如果脚本里需要稳定使用whereis最好显式带-B参数不要依赖环境差异。第二个原因是“它不是真的命令”。敲whereis cd大概率空结果因为cd是 shell 内建命令文件系统里没有对应的可执行文件。同样whereis ll查不到也很正常因为ll通常是ls -l的别名。这种场景改用type cd或者type ll看真实身份。第三个原因相对隐蔽命令安装后PATH还没刷新。有些安装脚本只改了/etc/profile当前会话没有执行source此时which也未必正确。但whereis因为还查默认目录偶尔反而能给出老版本路径这就是开头同事遇到“两个命令对不上”的常见来源。4.2 返回结果里有重复路径在部分系统上你会看到/bin/xxx和/usr/bin/xxx同时出现。这多半是因为/bin是/usr/bin的符号链接whereis同时命中了两个入口。不算错误只是它非常诚实地列出了所有能匹配的路径。解析结果时只取第一个匹配项就好。比如脚本里用whereis -b cmd获取输出后通过awk {print $2}拿第一个路径字段第一个字段是“命令名:”。如果想规避符号链接再加一步readlink -f做路径归一化。要特别提一个现象whereis偶尔会返回共享库文件路径。比如whereis curl在某些系统上会带上/usr/lib/x86_64-linux-gnu/libcurl.so.4这样的条目。因为/usr/lib目录也可能被纳入二进制搜索范围库里恰好有和命令名相关的文件。处理脚本时要做好心理准备别把每条结果都当成“可执行文件”。4.3 man 手册一直缺失二进制能找到但手册死活没有最常见原因是系统没装man-pages或对应的xxx-doc包。Linux 的命令手册经常拆成独立软件包维护比如 Debian 系下git的手册可能在git-man包里。另一个原因是手册目录不在whereis默认表里。你可以先执行man -w 命令名拿到 man 实际搜索路径如果路径确实存在而whereis -m查不到说明它没收录该目录。此时手动用-M 路径 -f 命令名验证即可。4.4 把路径和文件名搞混了很多人写whereis /usr/bin/python3然后返回空原因很简单whereis期待的是名字不是带完整路径的文件。如果你传了绝对路径它的匹配逻辑会出错大多数版本直接返回空。正确姿势是whereis python3再从结果里挑路径。这条规则写在脚本里尤其重要从配置里拿到完整路径去查文档时得先拆出目录和文件名用文件名去查。4.5 不同发行版行为不一致CentOS 7 和 Ubuntu 22.04 自带的whereis版本不同选项支持、默认目录表、是否叠加PATH都不是完全一致的。跨多套环境跑脚本时建议先加一步whereis -l | head -5的日志输出让系统自己交代它的搜索范围。必要时按发行版走不同分支别拿一套逻辑硬套所有机器。5. 和 which、type、find、locate 对比一张表看懂选型5.1 核心差异对照很多新手问我已经有which了为什么还要学whereis其实它们根本不是同一层面的工具。我把常用查找类命令放在一起对比命令搜索来源典型返回常用场景whereis系统标准目录 部分新版叠加 PATH二进制、源码、man 手册页查命令关联文件、批量审计which当前 shell 的 PATH第一个匹配的可执行文件路径确认敲命令时会执行哪个typeshell 语义别名、内建、函数、外部命令命令的真实类型和定义排查别名、内建命令find实时遍历指定目录目录树中所有匹配文件精确查找任意文件locate预生成文件数据库全库文件名匹配项快速全盘搜索已知文件名光看表不够实际差异往往体现在具体问题里。which git回答的是“当前环境会运行哪个 git”whereis git回答的是“git 的二进制、手册、源码分别在哪”type git回答的是“git 是外部命令还是函数”find / -name git回答的是“全盘里所有叫 git 的文件”。四个工具回答的是四个完全不同的问题。5.2 实际中我这样选写脚本判断命令是否存在我会用command -v golang这种 POSIX 标准写法或者 Bash 里的type -P golang用途是“确保能执行”。需要收集完整装配信息时比如生成系统文档、做依赖清单我会用whereis -b 命令名把每个命令的绝对路径都捞出来。想查配置文件、日志文件、数据文件时whereis和which都帮不上忙交给find或locate才是正道。which并没有被淘汰。它轻量、快速、输出干净在交互式终端里给人看最直接。whereis的输出格式适合脚本解析但字段在不同系统上会有噪音交互场景反而不如which干净。这也是很多老手的肌肉记忆里终端里直接敲的是which脚本批量处理时却转身去用whereis或command -v。6. 实战心得我踩过的三个坑和三个建议6.1 踩坑一以为 whereis 会自动跟踪 PATH结果拿到旧路径有次我从源码编译安装了新版vim装到了/usr/local/binPATH里也是这个目录优先敲vim用的是新版本。但whereis vim返回的却是/usr/bin/vim因为默认表里优先匹配了系统自带路径。那一刻我才彻底明白不能默认whereis跟随PATH它的标准路径优先级很高。如果脚本里要拿“真正会执行的命令路径”先command -v再readlink -f才是最稳的组合。6.2 踩坑二把 -f 写丢用-B指定目录时我刚开始总忘记写-f命令要么输出空要么把文件名当目录名继续找。后来养成一个条件反射但凡看到大写选项-B、-M、-S脑子里自动配对——后面一定跟一个-f再后面才是文件名。不确定时就用man whereis反复确认别凭记忆写。6.3 踩坑三结果里的 .so 文件被脚本误判做“服务可执行文件路径收集”脚本时whereis -b返回了匹配的共享库路径脚本顺手把它当成二进制拿去启动踩了个不大不小的坑。从那以后我的解析规则变成只从结果里取/usr/bin、/usr/local/bin这类以bin结尾的真实可执行路径其他一律跳过再配合file命令验证可执行类型。这条规则在跨发行版场景下尤其重要。6.4 三个实用建议第一用whereis -b代替裸的whereis作为脚本输入。默认输出会混入手册页和源码路径字段多、噪音大加-b之后干净得多。第二用whereis -m做文档完整性检查。新环境验收时跑一遍whereis -m curl wget tar git哪些手册缺失一眼便知。配合-u做批量审计能把“缺少帮助文档的命令”成批抓出来。第三把whereis当作理解程序安装布局的起点。查到路径之后顺着dirname再去翻docs、share、etc等兄弟目录往往能比纯find更快摸清一个陌生软件的安装全貌。这个思路在接手不熟悉的环境时特别实用能帮你快速建立整个系统的软件分布地图。我在实际使用中的整体感受是whereis不是一个全能搜索器但它在“查询命令关联文件”这件事上做到了一次到位、速度快、输出可解析。学会它之后我的终端里少了很多为找文档而反复敲find的多余操作。如果你之前一直把它晾在一边现在花几分钟把它纳入自己的常用工具箱后续排查环境时会爽快不少。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

tlb finish_asid_transition 2026/10/2 13:53:13

tlb finish_asid_transition

finish_asid_transition 是 AMD 广播 TLB 失效(Broadcast TLB Invalidation)补丁集中的关键同步函数。它的核心任务是:在完成一次广播 TLB 刷新后,确认所有正在运行该进程的 CPU 都已经切换到了新的全局 ASID,然后清除…

阅读更多 →
幽门螺杆菌根除,有望“少吃两种药“?双联方案 2026 专家共识来了 2026/10/2 13:52:55

幽门螺杆菌根除,有望“少吃两种药“?双联方案 2026 专家共识来了

幽门螺杆菌根除,有望"少吃两种药"?双联方案 2026 专家共识来了 InfoXMed是面向医生、医学生和医学科研人员的AI医学工具平台,提供文献检索、全文翻译、AI解读、指南查询和题库练习等功能,辅助临床学习、科研汇报与医学备…

阅读更多 →
Java基础语法总结一 2026/10/2 13:52:55

Java基础语法总结一

1.二进制关于计算机中二进制的三种表示方式: 1.原码、反码、补码。 2,计算机底层都是采用二进制的补码形式存储。(计算机底层的真实存储。) 3,对于Java来说,虽然底层真实采用二进制补码形式存储,但是打印到屏幕上的时候…

阅读更多 →
【神经网络干货】生成模型会不会只会背训练数据? 2026/10/2 13:52:55

【神经网络干货】生成模型会不会只会背训练数据?

生成模型会不会只会背训练数据?我一直觉得,讨论生成模型的“记忆”不能只看输出像不像某一张训练图片。更关键的问题是:模型学习到的运动方向,究竟把样本带向训练点本身,还是学会了训练点之间那片可以继续生成的空间&a…

阅读更多 →
掌握Prompt、Context、Harness三大工程,轻松驾驭大模型,小白程序员必备收藏指南 2026/10/2 13:52:54

掌握Prompt、Context、Harness三大工程,轻松驾驭大模型,小白程序员必备收藏指南

本文深入探讨了与AI大模型协作的三大核心工程:Prompt Engineering、Context Engineering和Harness Engineering。通过精心设计的提示词,有效管理上下文信息,以及构建可靠的系统框架,读者将学习如何最大化AI模型的潜力,…

阅读更多 →
西安本地中小商户的线上获客:从付费投放看长期数字资产 2026/10/2 13:52:54

西安本地中小商户的线上获客:从付费投放看长期数字资产

这两年我在陕西正方元网络科技有限公司做本地数字化服务,日常打交道的多是西安本地的实体门店和中小企业经营者。下面是一个不算新鲜的观察:越是把获客全部押在付费投放上的商家,越容易在停投之后感到被动。一、传统本地线上运营的现存痛点西…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉