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}'