如何以程式方式確定安裝的最高版本核心 RPM?
我想要編寫的腳本類似於以下內容:
if [ uname -r is not == highest version of kernel RPM installed ] then echo "You need to reboot to use the latest kernel" fi
問題是,如果輸出
rpm -q kernel
類似於:kernel-2.6.32-358.10.2.el6.x86_64 kernel-2.6.32-358.6.1.el6.x86_64
…我如何確定哪個更高?我知道一個簡單的字元串排序是不可靠的(在這個例子中它會倒退)。是否有 rpm 的快捷方式,還是我必須解析所有內容並自己進行比較?
TL; 博士
第三次嘗試確實有效!我將留下前 2 次嘗試,以便將來可能遇到此問答的其他人希望能夠深入了解解析 RPM 版本資訊並確定其血統是多麼重要的問題,首先,其次,等等
嘗試#1(OP說沒用)
此命令將對輸出進行排序並按版本順序為您提供它們:
$ rpm -q kernel --queryformat "%{VERSION} %{RELEASE}\n"|sort -n 2.6.18 238.12.1.el5 2.6.18 238.19.1.el5 2.6.18 274.12.1.el5 2.6.18 308.8.2.el5
**為什麼它不起作用:**天真的人會認為您可以使用
sort
命令的某些變體來執行此任務,但是對於給定的 RPM,實際版本資訊的格式存在足夠多的可變性和不一致,它只是不是’ t 完成任務。嘗試#2(OP說沒有用)
$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1 kernel-2.6.35.14-106.fc14
**為什麼它不起作用:**我非常希望這種方法能夠產生 OP 正在尋找的結果,但是正如@Joel 在評論中指出的那樣,這個問題是
--last
開關只是返回按以下方式排序的結果RPM 的安裝日期。嘗試#3
這個肯定會完成這項工作。我找到了一套名為 RPM Development Tools 的工具。該套件中有 2 個工具可以讓您確定一個 RPM 版本是比另一個版本新還是舊。
如果尚未安裝 RPM,您可以執行以下操作:
yum install rpmdevtools
第一個有用的工具叫做
rpmdev-vercmp
. 該工具可以比較 RPM 的 2 個名稱並告訴您哪個更新。例如:$ rpmdev-vercmp kernel-2.6.35.14-100.fc14.x86_64 kernel-2.6.35.14-103.fc14.x86_64 0:kernel-2.6.35.14-103.fc14.x86_64 is newer
在找到這個之後,我準備好編寫一個 shell 腳本,但後來意識到,我很懶,所以我又戳了幾分鐘,在套件中找到了另一個名為
rpmdev-sort
.這個工具是付費的。您可以按如下方式使用它:
$ rpm -q kernel | rpmdev-sort kernel-2.6.35.14-100.fc14.x86_64 kernel-2.6.35.14-103.fc14.x86_64 kernel-2.6.35.14-106.fc14.x86_64
RPM 開發工具中有很多工具可能值得其他人看看,所以我在這裡列出它們以供將來參考。
$ rpm -q --queryformat '[%{NAME} %{FILEMODES:perms} %{FILENAMES}\n]' rpmdevtools \ | grep -E "^.* -..x..x..x " \ | awk '{print $3}' \ | sed 's#/usr/bin/##' \ | paste - - - \ | column -t annotate-output checkbashisms licensecheck manpage-alert rpmargs rpmdev-bumpspec rpmdev-checksig rpmdev-cksum rpmdev-diff rpmdev-extract rpmdev-md5 rpmdev-newinit rpmdev-newspec rpmdev-packager rpmdev-rmdevelrpms rpmdev-setuptree rpmdev-sha1 rpmdev-sha224 rpmdev-sha256 rpmdev-sha384 rpmdev-sha512 rpmdev-sort rpmdev-sum rpmdev-vercmp rpmdev-wipetree rpmelfsym rpmfile rpminfo rpmls rpmpeek rpmsodiff rpmsoname spectool
#3 的替代方案
評論中提到的 OP 的替代方法是使用
sort -V
. 那是資本-V
。我也從來沒有聽說過這個開關。從sort
手冊頁:-V, --version-sort natural sort of (version) numbers within text
事實證明
sort
確實提供了對版本號進行排序的工具,因此您也可以像這樣執行排序:$ rpm -q kernel | sort -V kernel-2.6.35.14-100.fc14.x86_64 kernel-2.6.35.14-103.fc14.x86_64 kernel-2.6.35.14-106.fc14.x86_64