使用Perl检测操作系统类型

Sta*_*low 4 perl operating-system

我想使用Perl来检测操作系统类型.

例如:

假设我有一个安装程序,以便知道安装程序需要运行哪些命令.我将不得不检测安装的操作系统,例如Linux.让我们说它是Linux.现在哪种类型的Linux?

  • Fedora的
  • Ubuntu的
  • CentOS的
  • Debian的
  • 等等

我该怎么做?

Gil*_*not 5

第一步是检查$^O变量的输出.

如果输出是例如

Linux的

您需要更多处理来检测使用的分布.

perldoc perlvar.

到目前为止,您可以运行lsb_release -a以查看使用的分布.

如果此命令不存在,您可以测试文件的存在,如:

/etc/debian_version # debian or debian based
/etc/redhat-release # rpm like distro
Run Code Online (Sandbox Code Playgroud)

其他文件测试示例:检测基础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;
 }
Run Code Online (Sandbox Code Playgroud)

  • 它应该是`$ ^ O`(大写字母O),而不是零. (2认同)

Mig*_*Prz 5

此外,您可以使用Config(它是核心模块).这是一个例子:

use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";
Run Code Online (Sandbox Code Playgroud)

在我的Mac OS X上,它打印:

darwin
darwin-2level
Run Code Online (Sandbox Code Playgroud)


Jon*_*hop 5

根据perlvar,无论是$OSNAME$^O将给你操作系统.这也等同于使用$Config{'osname'}(有关更多信息,请参阅Config).Windows系统的特别注意事项:

在Windows平台上,$^O不是很有用:因为它总是MSWin32,它不能区分95/98/ME/NT/2000/XP/CE/.NET.使用Win32::GetOSName()Win32::GetOSVersion()(参见Win32perlport)来区分变体.

为了获得Linux机箱的确切平台,您需要使用他的答案中提到的类似xaxes的模块.