Perl を使用して OS の種類を検出したいと考えています。
例えば:
インストーラーが実行する必要があるコマンドを知るために、インストーラーがあるとしましょう。Linux など、インストールされているオペレーティング システムを検出する必要があります。Linuxだとしましょう。さて、どのタイプの Linux でしょうか?
- フェドーラ
- Ubuntu
- CentOS
- デビアン
- 等
どうすればいいですか?
Perl を使用して OS の種類を検出したいと考えています。
例えば:
インストーラーが実行する必要があるコマンドを知るために、インストーラーがあるとしましょう。Linux など、インストールされているオペレーティング システムを検出する必要があります。Linuxだとしましょう。さて、どのタイプの Linux でしょうか?
どうすればいいですか?
最初のステップは、$^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;
}
また、Config を使用することもできます (これはコア モジュールです)。これは例です:
use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";
私の Mac OS X では、次のように表示されます。
darwin
darwin-2level
perlvarによると、 orのどちら$OSNAME
か$^O
がオペレーティング システムを提供します。これは using と同等です$Config{'osname'}
(詳細についてはConfigを参照してください)。Windows システムに関する特記事項:
Windows プラットフォームで
$^O
は、あまり役に立ちません。これは常にMSWin32であるため、95/98/ME/NT/2000/XP/CE/.NET の違いはわかりません。Win32::GetOSName()
またはWin32::GetOSVersion()
( Win32とperlportを参照) を使用して、バリアントを区別します。
Linux ボックスの正確なプラットフォームを取得するには、彼の回答に記載されている xaxes のようなモジュールを使用する必要があります。
スクリプトが実行されている 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";
}
ファイルを確認できます - /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"