如何查詢哪個 RPM 包提供了特定版本
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 將其視為字元串而不是數字。這不會匹配 version2.0
,但不加引號 - 和數字 - 會讓它匹配。@ dave-thompson-085指出在操作中包含比較是不必要的。也就是說,前面的部分
{
是}
一個動作,適用於所有行(因為沒有給出模式)。引用 mawk 的手冊頁:AWK 程序是一系列模式 *{action}*對和使用者函式定義。
進而
A pattern can be: BEGIN END expression expression , expression
表達式可能是正則表達式,但也可能是比較。他建議的改進是
awk -F: '$1>=2{print $2}'