6

Perl を使用して OS の種類を検出したいと考えています。

例えば:

インストーラーが実行する必要があるコマンドを知るために、インストーラーがあるとしましょう。Linux など、インストールされているオペレーティング システムを検出する必要があります。Linuxだとしましょう。さて、どのタイプの Linux でしょうか?

  • フェドーラ
  • Ubuntu
  • CentOS
  • デビアン

どうすればいいですか?

4

6 に答える 6

6

最初のステップは、$^O変数の出力を確認することです。

出力がたとえば

Linux

どのディストリビューションが使用されているかを検出するには、さらに処理が必要です。

を参照してくださいperldoc perlvar

これまでのところ、実行lsb_release -aしてどのディストリビューションが使用されているかを確認できます。

このコマンドが存在しない場合は、次のようなファイルの存在をテストできます。

/etc/debian_version # debian or debian based
/etc/redhat-release # rpm like distro

その他のファイル テストの例:基礎となる Linux ディストリビューションの検出


モジュールを使用して分布を確認するxaxes のソリューションも検討してください。Linux::Distribution


パッケージ マネージャーを検出する場合は、次の方法を試すことができます。

 if ($^O eq "linux") {
     my $pm;

     do{
         if (-x qx(type -p $_ | tr -d "\n")) {
             $pm = $_;
             last;
         }
     } for qw/apt-get aptitude yum emerge pacman urpmi zypper/;

     print $pm;
 }
于 2013-02-16T16:25:27.143 に答える
5

また、Config を使用することもできます (これはコア モジュールです)。これは例です:

use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";

私の Mac OS X では、次のように表示されます。

darwin
darwin-2level
于 2013-02-16T16:31:12.997 に答える
5

perlvarによると、 orのどちら$OSNAME$^Oがオペレーティング システムを提供します。これは using と同等です$Config{'osname'}(詳細についてはConfigを参照してください)。Windows システムに関する特記事項:

Windows プラットフォームで$^Oは、あまり役に立ちません。これは常にMSWin32であるため、95/98/ME/NT/2000/XP/CE/.NET の違いはわかりません。Win32::GetOSName()またはWin32::GetOSVersion()( Win32perlportを参照) を使用して、バリアントを区別します。

Linux ボックスの正確なプラットフォームを取得するには、彼の回答に記載されている xaxes のようなモジュールを使用する必要があります。

于 2013-02-16T16:32:58.020 に答える
2

スクリプトが実行されている OS を特定するには、次を使用できます$^O

print $^O

Linux ::Distributionでディストリビューションを確認します。

use Linux::Distribution qw(distribution_name distribution_version);

my $linux = Linux::Distribution->new;
if (my $distro = $linux->distribution_name()) {
      my $version = $linux->distribution_version();
      print "you are running $distro, version $version\n";
} else {
      print "distribution unknown\n";
}
于 2013-02-16T16:25:28.050 に答える
0

ファイルを確認できます - /etc/os-release:

#!/usr/bin/perl

use feature(say);
use strict;
use warnings;


my %os=();

unless ( open(OS,"cat /etc/os-release|") ){
        say "ErrorOpenPipe OS_release";
        exit;
}

while (<OS>){
        my @os_param = split /=/, $_;
        $os{$os_param[0]}=$os_param[1];
}


my @FH;

say $os{ID};
say $os{VERSION_ID};

必要に応じて他のキーを使用します。

$ cat /etc/os-release 

NAME="Ubuntu"
VERSION="16.04.5 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

$ cat /etc/os-release 

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
于 2018-08-21T06:40:51.453 に答える