如何查询具体版本是哪个RPM包提供的

如何查询具体版本是哪个RPM包提供的

RPM SPEC 文件了解Requires:Provides:标签中的包版本,因此在 SPEC 文件内,即使名称混乱,也可以轻松构建适当的依赖关系(例如,避免冲突并允许包的多个版本)

作为示例,包 foo 提供了更新版本:

Name: foox
Provides: foo = 2

Name: bar5
Requires: foo >= 2

工作得很好 - yum 不会安装 bar5,除非还安装了foox。

我的问题 - 如何foo = 2从命令行查询提供哪个包?

从 rpm 的手册页可以看出

--提供什么能力

Query all packages that provide the CAPABILITY capability. 

--提供

List capabilities this package provides.

就足够了。
我可以rpm -q --provides <package name>看到版本。
我什至rpm -q --qf %{VERSION} <package name>只能得到版本。
但是,我无法rpm -q --whatprovides通过名称和版本来获取实际的包名称。

我也尝试过rpm -q --provides foo,但我只得到原始的 foo = 1,即使安装了 foox 并提供了 foo = 2。

我想要的是以下魔法:

$ rpm -q --whatprovides "foo = 2"
$ foox

答案1

那很接近:

rpm -q --whatprovides "foo = 2"

但它不接受版本。为此,请返回一步并格式化输出

rpm -q --whatprovides foo

像这样:

rpm -q --queryformat "%{VERSION}:%{NAME}\n" --whatprovides foo

并通过 grep 过滤结果(选择您的“2”),然后通过 sed 过滤结果,以删除后跟冒号的额外版本:

grep -E '/^2:/' | sed -e 's/^[^:]*://'

这仅给出了包名称。在实践中,您希望版本、发布和架构能够安装正确的依赖关系。

以供参考:5.2.5。确定哪个包提供某种功能(Fedora RPM 指南)

关于OP的评论,awk会更简单:

awk -F: '{ if ($1 == "2") print $2}'

我同意(但根据配置脚本的习惯,使用 awk 其次是 grep/sed,因为它的可移植性稍差)。然而,如果想要检查版本大于或等于给定值的包,awk 肯定会简单得多,例如,

awk -F: '{ if ($1 >= 2) print $2}'

今天早上我离开后我就想到了这一点。但这种类型的比较在规范文件中可能比精确匹配更常见。另外,引用"2"可能会强制 awk 将其视为字符串而不是数字。这不会匹配 version 2.0,但不加引号 - 和数字 - 会让它匹配。

@戴夫汤普森-085指出将比较包含在行动是不必要的。也就是说,对于所有行,前面{}后面的部分都是一个动作(因为没有给出模式)。引用自 mawk 的手册页:

AWK 程序是一系列图案 {行动}对和用户函数定义。

进而

   A pattern can be:
          BEGIN
          END
          expression
          expression , expression

表达式可能是正则表达式,但也可以是比较。他建议的改进是

awk -F: '$1>=2{print $2}'

相关内容