Как я могу обнаружить операционную систему в Perl?
У меня есть Perl на Mac, Windows и Ubuntu. Как я могу сказать из сценария, кто есть кто? Спасибо заранее.
Edit: меня спросили, что я делаю. Это сценарий, часть нашей кросс-платформенной системы сборки. Сценарий повторяется в каталогах и выяснит, какие файлы, чтобы построить. Некоторые файлы специфичны для платформы, и, таким образом, в Linux я не хочу создавать файлы, заканчивающиеся на _win.СРР и т. д.
9 ответов
изучить $^O
переменная, которая будет содержать имя операционной системы:
print "$^O\n";
, который печатает linux
в Linux и MSWin32
на Windows.
вы также можете ссылаться на эту переменную по имени $OSNAME
если вы используете английский язык модуль:
use English qw' -no_match_vars ';
print "$OSNAME\n";
по данным perlport, $^O
будет darwin
на Mac OS Х.
вы также можете использовать Config базовый модуль, который может предоставить ту же информацию (и намного больше):
use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";
который на моей машине Ubuntu печатает:
linux
i486-linux-gnu-thread-multi
обратите внимание, что эта информация основана на системе, которая Perl была построен, что не обязательно система 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 выглядит как относительно чистое потенциальное решение, но в настоящее время, похоже, не поддерживает Mac. Хотя это не должно быть слишком много работы, чтобы добавить это.
переменная $^O (это заглавная "O", а не ноль) содержит имя операционной системы.
в зависимости от того, что вы хотите, он может или не может дать ответ, который вы хотите - в моей системе он дает "linux", не говоря, какой дистрибутив. Я не уверен в том, что он говорит в Windows или MacOS.
посмотреть в источник File::Spec
чтобы увидеть, как он загружает правильный делегат на основе операционной системы. :)
File::Spec
имеет отдельный файл модуля Perl для каждой ОС. File::Spec::Win32
, File::Spec::OS2
, etc...
он проверяет операционную систему и загрузите соответствующий .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");
здесь краткий справочник о том, как найти ОС локальная машина работает от Perl.
переменная $^O ($OSTYPE, если вы используете английский) содержит операционную систему, для которой был создан ваш двоичный файл perl.
#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;
да использование Config module может быть хорошей вещью. Еще одна возможность-получить информацию из/etc / *release files
например..
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"