在 Linux 日常运维和软件包管理工作中,开发者或系统管理员经常面临一个尴尬的场景:需要在另一个发行版上查找某个软件包的具体版本信息,却不熟悉该发行版的包查询工具。即便对于同属 RPM 系的 Fedora 和 openSUSE,dnf 与 zypper 的查询语法也存在差异,更不用说 Debian 系的 apt 与 Arch 系的 pacman 了。whohas 正是为解决这一痛点而生的跨发行版包查询工具。
whohas 核心设计理念
whohas 由 Perl 编写,最初设计目的是帮助软件包维护者从其他发行版的现有包定义(如 ebuild、pkgbuild)中学习参考。它的核心能力是同时向多个发行版的包仓库发起查询,以统一的表格形式返回结果,用户无需记忆各发行版特定的查询命令和参数。
该工具目前支持查询的发行版涵盖:Arch Linux、Debian(含 oldstable、stable、testing、unstable 各分支)、Fedora、Gentoo、Mageia、Mandriva、openSUSE、Slackware、Source Mage、Ubuntu、FreeBSD、NetBSD、OpenBSD、Fink、MacPorts 以及 Cygwin。这种覆盖面在同类工具中相当少见,基本覆盖了主流的 Linux 发行版和重要的 BSD 系统。
输出格式与字段说明
执行 whohas <包名> 后,工具会返回一张结构化表格,包含以下关键字段:第一列为发行版名称,第二列为包名,第三列为版本号,第四列为更新日期,第五列为对应的仓库分支(如 Debian 的 stable、testing,Arch 的 core、extra、community),最后一列为指向官方包页面的超链接。输出字段长度固定,这一特性允许用户使用 cut 命令灵活提取特定列的数据,例如 whohas vim | grep " vim " | cut -b 36-45 可以精确获取版本号列。
在实际使用中,结合 grep 进行结果过滤是常见操作。例如 whohas gimp | grep "gimp " 可以排除 gimp-print 等子包;whohas gimp | grep Arch 则仅显示 Arch Linux 相关结果。如果需要区分包名与发行版名称(如查询 "arch" 包),可使用 whohas arch | grep "^Arch" 避免误匹配。
典型应用场景
whohas 的价值体现在多个维度的使用场景中。对于跨平台开发者而言,当需要在不同发行版上部署相同应用时,可以快速对比各发行版当前提供的版本,选择兼容性最好的版本或依赖路径。对于软件包维护者,可以参考其他发行版(如 Gentoo 的 ebuild 或 Arch 的 PKGBUILD)编写自己的包定义,学习其打包策略和依赖处理方式。
系统迁移场景同样适用:当你从 CentOS 迁移到 Debian,或者从 Arch 切换到 openSUSE 时,可以预先查询目标发行版是否包含所需的软件包,以及具体的版本信息,从而评估迁移成本和兼容性。另外,在安全漏洞响应场景中,安全研究人员可以借助 whohas 快速确认某软件在各发行版的版本分布,评估漏洞影响范围。
与同类工具的协同
虽然 whohas 本身已相当强大,但它并非唯一的跨发行版包查询方案。官方文档中提及了若干互补工具:Repology 是一个开源的版本追踪服务,专注于汇总各发行版中同一软件包的版本号差异,适合长期监控包版本演化;pkgs.org 提供了网页端的统一搜索接口,无需安装客户端即可查询。这三者的定位略有差异:whohas 偏向本地 CLI 快速查询,Repology 侧重版本对比与更新追踪,pkgs.org 则适合临时性的网页检索。实际工作中可以根据需求组合使用。
需要注意的是,whohas 查询的版本信息基于各发行版官方仓库的当前状态,部分冷门仓库可能存在更新延迟;Debian 仅支持 binary 发行版查询,Slackware 默认查询 Current 分支;所有细节均以 x86 架构为主。鉴于这些限制,建议用户在实际使用中仍需参考输出结果提供的官方链接,核对最新的包详情。
安装与获取
whohas 的源代码托管于 GitHub,项目地址为 github.com/whohas/whohas。由于采用 Perl 实现,多数 Linux 发行版的默认仓库中已包含该工具,可直接通过系统包管理器安装。对于 Arch Linux 用户,可通过 AUR 获取;Debian/Ubuntu 用户可使用 apt 安装;macOS 用户则可通过 Homebrew 安装 perl 包后手动部署。安装完成后,直接在终端输入 whohas <包名> 即可开始跨发行版包查询之旅。
资料来源:GitHub 仓库 github.com/whohas/whohas