У меня есть Perl на Mac, Windows и Ubuntu. Как я могу узнать из script, какой из них? Спасибо заранее.
Изменить: Меня спросили, что я делаю. Это script, часть нашей кросс-платформенной системы сборки. script рекурсирует каталоги и вычисляет, какие файлы нужно создавать. Некоторые файлы зависят от платформы, и поэтому в Linux я не хочу создавать файлы, заканчивающиеся на _win.cpp и т.д.
Изучите переменную $^O
, которая будет содержать имя операционной системы:
print "$^O\n";
Что печатает linux
в Linux и MSWin32
в Windows.
Вы также можете обратиться к этой переменной с именем $OSNAME
, если вы используете English:
use English qw' -no_match_vars ';
print "$OSNAME\n";
Согласно perlport, $^O
будет darwin
в Mac OS X.
Вы также можете использовать основной модуль Config, который может предоставить ту же информацию (и многое другое):
use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";
Что на моей машине Ubuntu печатает:
linux
i486-linux-gnu-thread-multi
Обратите внимание, что эта информация основана на системе, которую построил Perl, что не обязательно является системой, в которой в настоящее время работает Perl (то же самое верно для $^O
и $OSNAME
); OS вряд ли будет отличаться, но некоторые данные, такие как название архитектуры, могут быть очень хорошими.
Если вам нужна более конкретная информация о 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.
Ниже приведено краткое описание того, как найти ОС, на которой работает локальная машина, от Perl.
Переменная $^ O ($ OSTYPE, если вы используете английский) содержит операционную систему, для которой был создан ваш perl-бинарный файл.
Классический однострочный:
my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
Просмотрите источник File::Spec
, чтобы узнать, как он загружает нужный делегат на основе операционной системы.:)
#Assign the $home_directory variable the path of the user 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 может быть хорошим. Еще одна возможность - получить информацию из файлов /etc/ * release
например.
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"