我在Mac,Windows和Ubuntu上使用Perl。如何在脚本中告诉哪一个是哪个?提前谢谢。
编辑:我被问到我在做什么。它是一个脚本,是我们跨平台构建系统的一部分。该脚本会递归目录并确定要构建的文件。有些文件是特定于平台的,因此,在Linux上我不想构建以_win.cpp等结尾的文件。
答案 0 :(得分:78)
检查将包含操作系统名称的$^O
变量:
print "$^O\n";
在Linux上打印linux
,在Windows上打印MSWin32
。
如果您使用$OSNAME
模块,也可以使用名称English来引用此变量:
use English qw' -no_match_vars ';
print "$OSNAME\n";
根据perlport,{/ 3}}将在Mac OS X上为darwin
。
您还可以使用$^O
核心模块,该模块可以提供相同的信息(以及更多信息):
use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";
在我的Ubuntu机器上打印:
linux
i486-linux-gnu-thread-multi
请注意,此信息基于Perl 构建的系统,这不一定是Perl当前正在运行的系统(对于Config和{{3也是如此] }});操作系统可能不会有所不同,但一些信息,如架构名称,可能就是这样。
答案 1 :(得分:12)
如果您需要有关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();
答案 2 :(得分:7)
Sys::Info::OS看起来是一个相对干净的潜在解决方案,但目前似乎并不支持Mac。尽管如此,添加它不应该是太多的工作。
答案 3 :(得分:6)
查看File::Spec
的源代码,了解它如何根据操作系统加载正确的委托。 :)
File::Spec
为每个操作系统都有一个单独的Perl模块文件。 File::Spec::Win32
,File::Spec::OS2
等等......
它会检查操作系统,并在运行时根据操作系统加载相应的.pm
文件。
# From the source code of File::Spec
my %module = (
MSWin32 => 'Win32',
os2 => 'OS2',
VMS => 'VMS',
NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare.
symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian.
dos => 'OS2', # Yes, File::Spec::OS2 works on DJGPP.
cygwin => 'Cygwin',
amigaos => 'AmigaOS');
my $module = $module{$^O} || 'Unix';
require "File/Spec/$module.pm";
our @ISA = ("File::Spec::$module");
答案 4 :(得分:3)
变量$ ^ O(即大写'O',而不是零)保存操作系统的名称。
根据你的需要,它可能会或可能不会给你想要的答案 - 在我的系统上,它给出了'linux'而不说哪个发行版。我不太确定它在Windows或MacOS上的含义。
答案 5 :(得分:2)
Here's快速参考如何从Perl中找到本地机器运行的操作系统。
$ ^ O变量(如果使用英语,则为$ OSTYPE)包含为perl二进制文件构建的操作系统。
答案 6 :(得分:1)
经典的单行:
my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
答案 7 :(得分:1)
Mac计算机上的FYI $ ^ O现在返回10.13.6(高塞拉利昂)和10.15.4(卡塔利娜)的“ darwin”。
答案 8 :(得分:0)
#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;
答案 9 :(得分:0)
有关预包装的perl模块中的通用映射,请查看Perl::OSType
。
Module::Build
使用了它。
答案 10 :(得分:-3)
是的,使用Config模块可能是一件好事。另一种可能性是从/ 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"