如何在Perl中检测操作系统?

我在Mac,Windows和Ubuntu上有Perl。 我怎么能从剧本中知道哪一个是哪个? 提前致谢。

编辑:我被问到我在做什么。 这是一个脚本,是我们跨平台构build系统的一部分。 该脚本recursion目录并计算出要构build的文件。 有些文件是特定于平台的,因此在Linux上我不想生成以_win.cpp结尾的文件等等。

检查将包含操作系统名称的$^Ovariables:

 print "$^O\n"; 

它在Linux上打印Linux,在Windows上打印MSWin32

如果您使用英文模块,也可以通过名称$OSNAME引用此variables:

 use English qw' -no_match_vars '; print "$OSNAME\n"; 

根据perlport , $^O将在Mac OS X上darwin


您也可以使用configuration核心模块,它可以提供相同的信息(以及更多):

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

在我的Ubuntu机器上打印:

 linux i486-linux-gnu-thread-multi 

请注意,这些信息基于Perl 构build的系统,不一定是Perl正在运行的系统(对于$^O$OSNAME同样如此); 操作系统将不会有所不同,但一些信息,如架构的名称,可能会很好。

如果您需要Windows上的更多特定信息,这可能会有所帮助。

 my $osname = $^O; if( $osname eq 'MSWin32' ){{ eval { require Win32; } or last; $osname = Win32::GetOSName(); # work around for historical reasons $osname = 'WinXP' if $osname =~ /^WinXP/; }} 

从我写的原始版本sysinfo.t派生。

如果您需要更详细的信息:

 my ( $osvername, $major, $minor, $id ) = Win32::GetOSVersion(); 

Sys :: Info :: OS看起来像一个相对干净的潜在解决scheme,但目前似乎不支持Mac。 不过,添加这个应该不是太多工作。

variables$ ^ O(这是一个大写字母'O',不是零)保存操作系统的名称。

根据你想要什么,它可能会也可能不会给你想要的答案 – 在我的系统上,它给出了“Linux”,而不说哪个发行版。 我不太确定在Windows或MacOS上所说的内容。

这里有一个关于如何find本地机器从Perl运行的操作系统的快速参考。

$ ^ Ovariables(如果使用英文,则为$ OSTYPE)包含您的perl二进制文件的操作系统。

查看File::Spec的源代码来查看它如何根据操作系统加载正确的代理。 🙂

一个经典的一行:

 my $windows=($^O=~/Win/)?1:0;# Are we running on windows? 
 #Assign the $home_directory variable the path of the user's home directory my $home_directory = ($^O eq /Win/) ? $ENV{HOMEPATH} : $ENV{HOME}; #Then you can read/write to files in the home directory open(FILE, ">$home_directory/my_tmp_file"); print FILE "This is a test\n"; close FILE; #And/or read the contents of the file open(FILE, "<$home_directory/my_tmp_file"); while (<FILE>){ print $_; } close FILE; 

是的使用configuration模块可以是一件好事。 还有一种可能性是从/ etc / *发布文件获取信息

例如..

cat / etc / os-release

 NAME="UBUNTU" VERSION="12.0.2 LTS, Precise Pangolin" ID="UBUNTU" ID_LIKE=debian PRETTY_NAME="Ubuntu precise (12.0.2 LTS)" VERSION_ID="12.04"