Как я могу обнаружить операционную систему в 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.


классический сценарий:

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

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