Как я могу перечислить самую высокую версию ядра в Perl - PullRequest
1 голос
/ 01 октября 2019

Во многих док-контейнерах le / boot пуст. Тем не менее, vmlinuz доступен в / var / lib / modules / / vmlinuz

В оболочке я могу сделать:

for kver in $(ls /lib/modules|sort -Vr)
do
    test -f /lib/modules/$kver/vmlinuz && echo $kver && break
done

Как я могу сделать это perl внадежный способ (я имею в виду: использование модулей, которые присутствуют в CentOS-6 до CentOS-8 или любом другом дистрибутиве Linux.

Я видел, что модули для сравнения версий ядра или сортировки версий, но ни один не доступен какПакет дистрибутивов во всех выпусках CentOS в диапазоне от 6 до 8 включен (8 важен, поскольку он является клоном RHEL-8, а RHEL-8 является чрезвычайно урезанным дистрибутивом в отношении пакетов perl).

Если у меня есть эти 2версии: 4.18.0-144.el8.x86_64 4.18.0-80.7.1.el8_0.x86_64 Мне нужно выбрать -144.

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

Самый простой способ сделать это - использовать модуль Sort :: Versions (который необходимо установить из CPAN).

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Sort::Versions;
use File::Basename;

for (sort { versioncmp($b, $a) } glob '/lib/modules/*') {
  my $ver = basename $_;
  if (-e "/lib/modules/$ver/vmlinuz") {
    say $ver;
    last;
  }
}

Обновить: Ваш вопрос включает в себя следующее:

Я видел, что модули для сравнения версий ядра или сортировки версий, но ни один из них не доступен в виде дистрибутива во всех выпусках CentOS от 6 до 8 включительно.

Конечно, пакеты - не единственный способ установки модулей CPAN. Вы всегда можете использовать cpan или cpanm. Но если вы действительно не хотите устанавливать модуль таким образом, вы также можете вырезать и вставить подпрограмму versioncmp() в свой код. Это всего несколько десятков строк кода.

sub versioncmp ($$) {
    my @A = ($_[0] =~ /([-.]|\d+|[^-.\d]+)/g);
    my @B = ($_[1] =~ /([-.]|\d+|[^-.\d]+)/g);

    my ($A, $B);
    while (@A and @B) {
        $A = shift @A;
        $B = shift @B;
        if ($A eq '-' and $B eq '-') {
            next;
        } elsif ( $A eq '-' ) {
            return -1;
        } elsif ( $B eq '-') {
            return 1;
        } elsif ($A eq '.' and $B eq '.') {
            next;
        } elsif ( $A eq '.' ) {
            return -1;
        } elsif ( $B eq '.' ) {
            return 1;
        } elsif ($A =~ /^\d+$/ and $B =~ /^\d+$/) {
            if ($A =~ /^0/ || $B =~ /^0/) {
                return $A cmp $B if $A cmp $B;
            } else {
                return $A <=> $B if $A <=> $B;
            }
        } else {
            $A = uc $A;
            $B = uc $B;
            return $A cmp $B if $A cmp $B;
        }       
    }
    @A <=> @B;
}
1 голос
/ 01 октября 2019

Обманывает ли использование ls в Perl?

for (`ls -rv /lib/modules/`){
  chomp;
  next unless -e "/lib/modules/$_/vmlinuz";
  say; 
  last;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...