我要编写的脚本大致如下:
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是否有快捷方式,还是我必须解析所有内容并自己比较?
第三次尝试实际上有效!我将离开前两次尝试,以便将来可能会遇到此问答的其他人希望对解析RPM版本信息并确定其先后顺序,后继顺序,等等。
此命令将对输出进行排序,并按版本顺序为您提供:
$ 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,实际版本信息的格式存在足够的可变性和不一致性,而这仅仅是事实而已。完成任务。
$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1
kernel-2.6.35.14-106.fc14
为什么不起作用:我非常希望这种方法能够产生OP所需的结果,但是@Joel在评论中指出的这种方法的问题在于,该--last
开关仅返回了按以下方式排序的结果: RPM的安装日期。
这肯定会做的工作。我找到了一套称为RPM开发工具的工具。此套件中有2个工具,使您能够确定某个版本的RPM是新版本还是旧版本。
如果尚未安装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
找到这个之后,我就准备好编写一个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
注释中提到的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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句