如何以编程方式确定安装的最高版本的内核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; DR

第三次尝试实际上有效!我将离开前两次尝试,以便将来可能会遇到此问答的其他人希望对解析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,实际版本信息的格式存在足够的可变性和不一致性,而这仅仅是事实而已。完成任务。

尝试#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开发工具的工具。此套件中有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

#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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何确定安装了哪个版本的Ubuntu桌面

来自分类Dev

如何确定安装了哪个版本的gfortran?

来自分类Dev

如何以编程方式确定bean的范围

来自分类Dev

如何以过时的方式确定Windows版本

来自分类Dev

如何以编程方式绑定版本令牌?

来自分类Dev

如何以编程方式获取Cassandra版本

来自分类Dev

如何以编程方式比较magento版本?

来自分类Dev

如何以编程方式找到Swift的版本?

来自分类Dev

如何以编程方式更新Flink版本

来自分类Dev

如何以编程方式确定GAC中是否安装了.NET程序集?

来自分类Dev

如何以编程方式确定GAC中是否安装了.NET程序集?

来自分类Dev

如何以编程方式安装VisualStudio扩展?

来自分类Dev

如何以编程方式激活“已安装”?

来自分类Dev

如何以编程方式安装打字

来自分类Dev

如何以正确的方式安装RPM软件包?

来自分类Dev

如何以编程方式确定Cassandra群集中的节点数?

来自分类Dev

如何以编程方式确定字体是否为CFF?

来自分类Dev

如何以编程方式确定帐户是否属于Administrators组?

来自分类Dev

如何以编程方式确定函数参数的默认值?

来自分类Dev

如何以编程方式确定 .NET 项目的类型

来自分类Dev

Android(4.3及更高版本。)如何以编程方式锁定屏幕?

来自分类Dev

如何以编程方式检测Windows Phone 8.1 OS版本?

来自分类Dev

如何以编程方式获取露天版本号

来自分类Dev

如何以编程方式获取Fabric / Crashlytics框架版本?

来自分类Dev

如何以编程方式检测Visual Studio版本?

来自分类Dev

如何以编程方式找到 Bluebird 的版本号?

来自分类Dev

如何以编程方式在模块安装上创建页面?

来自分类Dev

如何以编程方式安装字体(C#)

来自分类Dev

iOS:如何以编程方式安装配置文件

Related 相关文章

  1. 1

    如何确定安装了哪个版本的Ubuntu桌面

  2. 2

    如何确定安装了哪个版本的gfortran?

  3. 3

    如何以编程方式确定bean的范围

  4. 4

    如何以过时的方式确定Windows版本

  5. 5

    如何以编程方式绑定版本令牌?

  6. 6

    如何以编程方式获取Cassandra版本

  7. 7

    如何以编程方式比较magento版本?

  8. 8

    如何以编程方式找到Swift的版本?

  9. 9

    如何以编程方式更新Flink版本

  10. 10

    如何以编程方式确定GAC中是否安装了.NET程序集?

  11. 11

    如何以编程方式确定GAC中是否安装了.NET程序集?

  12. 12

    如何以编程方式安装VisualStudio扩展?

  13. 13

    如何以编程方式激活“已安装”?

  14. 14

    如何以编程方式安装打字

  15. 15

    如何以正确的方式安装RPM软件包?

  16. 16

    如何以编程方式确定Cassandra群集中的节点数?

  17. 17

    如何以编程方式确定字体是否为CFF?

  18. 18

    如何以编程方式确定帐户是否属于Administrators组?

  19. 19

    如何以编程方式确定函数参数的默认值?

  20. 20

    如何以编程方式确定 .NET 项目的类型

  21. 21

    Android(4.3及更高版本。)如何以编程方式锁定屏幕?

  22. 22

    如何以编程方式检测Windows Phone 8.1 OS版本?

  23. 23

    如何以编程方式获取露天版本号

  24. 24

    如何以编程方式获取Fabric / Crashlytics框架版本?

  25. 25

    如何以编程方式检测Visual Studio版本?

  26. 26

    如何以编程方式找到 Bluebird 的版本号?

  27. 27

    如何以编程方式在模块安装上创建页面?

  28. 28

    如何以编程方式安装字体(C#)

  29. 29

    iOS:如何以编程方式安装配置文件

热门标签

归档