Как я могу обнаружить операционную систему в Perl? - PullRequest
54 голосов
/ 02 декабря 2008

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

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

Ответы [ 10 ]

78 голосов
/ 02 декабря 2008

Проверьте переменную $^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); ОС вряд ли будет отличаться, но некоторая информация, такая как имя архитектуры, вполне может быть.

12 голосов
/ 03 декабря 2008

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

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

6 голосов
/ 03 декабря 2008

Загляните внутрь источника для 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");
3 голосов
/ 02 декабря 2008

Переменная $ ^ O (это заглавная 'O', а не ноль) содержит имя операционной системы.

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

2 голосов
/ 02 декабря 2008

Вот краткий справочник о том, как найти ОС, на которой локальный компьютер работает с Perl.

Переменная $ ^ O ($ OSTYPE, если вы используете английский) содержит операционную систему, для которой был создан ваш бинарный файл perl.

1 голос
/ 29 декабря 2011

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

my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
0 голосов
/ 18 октября 2018

Для общего отображения в предварительно упакованном модуле perl, проверьте Perl::OSType.

Используется Module::Build.

0 голосов
/ 02 сентября 2013

да, использование модуля Config может быть хорошей вещью. Еще одна возможность - получить информацию из файлов / etc / * release

например, ..

кошка / 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"
0 голосов
/ 23 июля 2013
#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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...