如何在Perl中检测操作系统?
我在Mac,Windows和Ubuntu上有Perl。 我怎么能从剧本中知道哪一个是哪个? 提前致谢。
编辑:我被问到我在做什么。 这是一个脚本,是我们跨平台构build系统的一部分。 该脚本recursion目录并计算出要构build的文件。 有些文件是特定于平台的,因此在Linux上我不想生成以_win.cpp结尾的文件等等。
检查将包含操作系统名称的$^O
variables:
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"