Как я могу обнаружить операционную систему в Perl?
У меня есть Perl на Mac, Windows и Ubuntu. Как я могу сказать из сценария, какой из них какой? Спасибо заранее.
Edit: меня спросили, что я делаю. Это скрипт, часть нашей кроссплатформенной системы сборки. Сценарий повторяется в каталогах и выяснит, какие файлы, чтобы построить. Некоторые файлы зависят от платформы, и поэтому в Linux я не хочу создавать файлы, заканчивающиеся на _win.cpp, etc.
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.Т, который я написал в оригинальной версии.
Если вам нужна более подробная информация:
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и т. д...он проверяет операционную систему и загрузите соответствующий
.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;
да использование модуля конфигурации может быть хорошей вещью. Еще одна возможность-получить информацию из/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"
Comments