Подтвердить что ты не робот

Как определить операционную систему в Perl?

У меня есть Perl на Mac, Windows и Ubuntu. Как я могу узнать из script, какой из них? Спасибо заранее.

Изменить: Меня спросили, что я делаю. Это script, часть нашей кросс-платформенной системы сборки. script рекурсирует каталоги и вычисляет, какие файлы нужно создавать. Некоторые файлы зависят от платформы, и поэтому в Linux я не хочу создавать файлы, заканчивающиеся на _win.cpp и т.д.

4b9b3361

Ответ 1

Изучите переменную $^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 вряд ли будет отличаться, но некоторые данные, такие как название архитектуры, могут быть очень хорошими.

Ответ 2

Если вам нужна более конкретная информация о 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();

Ответ 3

Sys::Info::OS выглядит как относительно чистое потенциальное решение, но в настоящее время, похоже, не поддерживает Mac. Это не должно быть слишком много, чтобы добавить это, хотя.

Ответ 4

Переменная $^ O (что капитал "O", а не ноль) содержит имя операционной системы.

В зависимости от того, что вы хотите, он может или не может дать ответ, который вы хотите - на моей системе он дает "linux", не говоря, какой дистрибутив. Я не уверен в том, что он говорит в Windows или MacOS.

Ответ 6

Просмотрите источник File::Spec, чтобы узнать, как он загружает нужный делегат на основе операционной системы.:)

Ответ 7

Классический однострочный:

my $windows=($^O=~/Win/)?1:0;# Are we running on windows?

Ответ 8

#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;

Ответ 9

да использование модуля 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"