Rpm

如何查詢哪個 RPM 包提供了特定版本

  • February 10, 2021

Requires:RPM SPEC 文件在和標籤中都知道包版本Provides:,因此在 SPEC 文件中,即使名稱不正確,也很容易建構正確的依賴關係(例如,避免衝突並允許多個版本的包)

作為範例包 foo 提供更新版本:

Name: foox
Provides: foo = 2

Name: bar5
Requires: foo >= 2

效果很好 - yum 不會安裝 bar5,除非還安裝了 foox。

我的問題 - 我如何foo = 2從命令行查詢哪個包提供?

從 rpm 的手冊頁看來,

–whatprovides 能力

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

那很接近:

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,但不加引號 - 和數字 - 會讓它匹配。

@ dave-thompson-085指出在操作中包含比較是不必要的。也就是說,前面的部分{}一個動作,適用於所有行(因為沒有給出模式)。引用 mawk 的手冊頁

AWK 程序是一系列模式 *{action}*對和使用者函式定義。

進而

  A pattern can be:
         BEGIN
         END
         expression
         expression , expression

表達式可能是正則表達式,但也可能是比較。他建議的改進是

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

引用自:https://unix.stackexchange.com/questions/242092