私が書きたいスクリプトはこんな感じです。
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のショートカットがありますか?それとも、すべてを直接分析して比較する必要がありますか?
ベストアンサー1
長い話を短く
実際に3回目の試みで成功しました! RPMのバージョン情報を解析し、最初、2番目などの系譜を決定することがどれほど重要であるかについて、問題に関する洞察を得るために、後でこのQ&Aに触れることができる他の人のために、最初の2回の試みをここに残します。
試み#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 の実際のバージョン情報形式には、操作に適さない変動性と不一致が十分にあります。
試み#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開発ツールと呼ばれるツールセットを見つけました。このスイートには、RPMの1つのバージョンが他のバージョンよりも最新であるか、以前のバージョンであるかを確認するための2つのツールがあります。
RPMがまだインストールされていない場合は、次のことができます。
yum install rpmdevtools
最初の便利なツールですrpmdev-vercmp
。このツールは、2つのRPM名を比較して、どちらが新しいものかを知ることができます。たとえば、
$ 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
これを見つけた後、シェルスクリプトを書こうとしましたが、怠惰であることに気づき、数分以上投資して、スイートから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
.that's a capitalを使用することです-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