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

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

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


person mxcl    schedule 02.12.2008    source источник
comment
Зачем тебе это нужно знать? [На ваш вопрос может быть более подходящий ответ, в зависимости от того, что (и если что) вы делаете, что зависит от платформы.]   -  person Rob    schedule 03.12.2008


Ответы (10)


Изучите переменную $^O, которая будет содержать имя операционной системы:

print "$^O\n";

Что печатает linux в Linux и MSWin32 в Windows.

Вы также можете ссылаться на эту переменную по имени $OSNAME, если используете английский модуль:

use English qw' -no_match_vars ';
print "$OSNAME\n";

Согласно perlport, _ 7_ будет darwin в Mac OS X.


Вы также можете использовать основной модуль Config, который может предоставить ту же информацию (и многое другое) :

use Config;

print "$Config{osname}\n";
print "$Config{archname}\n";

Что на моей машине с Ubuntu печатает:

linux
i486-linux-gnu-thread-multi

Обратите внимание, что эта информация основана на системе, в которой Perl был построен, которая не обязательно является системой, в которой Perl в настоящее время работает (то же самое верно для _ 11_ и $OSNAME); ОС, скорее всего, не будет отличаться, но некоторая информация, такая как название архитектуры, вполне может быть.

person Robert Gamble    schedule 02.12.2008
comment
Спасибо :) А для других людей, которые могут использовать этот ответ, cygwin perl возвращает cygwin, поэтому для Windows есть две возможности. - person mxcl; 03.12.2008
comment
Более двух; был порт dos, а порт os2 использовался для работы в Windows. Все возможные значения $ ^ O теоретически задокументированы в ‹< a href = "http://perldoc.perl.org/perlport.html" rel = "nofollow noreferrer"> perldoc.perl.org/perlport.html ›. - person ysth; 03.12.2008
comment
напечатать $ ^ O \ n; действительно печатает Дарвин на моей системе Mac OS X. - person ShreevatsaR; 03.12.2008
comment
@ysth, кстати, опечатка в вашей ссылке - person thecoshman; 13.12.2012
comment
Опечатка исходит от задней угловой скобки. Это должно быть perldoc.perl.org/perlport.html. - person Alan; 21.12.2012
comment
Работает даже для подсистемы Windows 10 для Linux: указание linux при выполнении через ubuntu-bash, msys и в родном режиме Windows. - person mbx; 26.09.2016
comment
В случае, если кто-то временно застрянет на этом, потому что вы получаете STDOUT_TOP0 в качестве вывода, убедитесь, что вы используете $^O вместо $^0. Не могу сказать, откуда я это знаю, но поверьте мне ... - person Anthony; 13.11.2016

Если вам нужна более конкретная информация о 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();
person Brad Gilbert    schedule 03.12.2008
comment
win32 использует устаревшую функцию GetVersionExA. Не работает vor Версия ›6.2 - person Mayra Delgado; 14.12.2016
comment
@MayraDelgado Действительно, и, похоже, прямой замены нет. Вот почему тот, кому это нужно, должен выяснить, как это исправить, и предоставить запрос на перенос. Я все равно редко использую Windows, так что вряд ли это буду я. - person Brad Gilbert; 14.12.2016

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

person Leon Timmermans    schedule 02.12.2008
comment
Это был бы лучший ответ, если бы он поддерживал Mac. Я предпочитаю функции, поддерживаемые компилятором, а не строки проблем с обслуживанием. - person mxcl; 03.12.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");
person brian d foy    schedule 03.12.2008
comment
Это, наверное, лучший ответ из всех возможных. К сожалению, это не считается популярным, потому что никто не хочет проводить какие-либо исследования самостоятельно, кроме Stack Overflow. Я собираюсь добавить к ответу, чтобы ленивым людям не приходилось выполнять всю тяжелую работу по переходу по ссылке. :П - person tjwrona1992; 09.03.2018

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

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

person Geoglyph    schedule 02.12.2008

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

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

person willasaywhat    schedule 02.12.2008

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

my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
person Hawk    schedule 29.12.2011
comment
За исключением случаев, когда вы используете darwin os! - person ; 12.04.2012
comment
Дерьмо! Ты прав! Чувствительность к регистру, кажется, исправляет. Я исправил это выше. Хороший улов! - person Hawk; 16.09.2012
comment
версия с учетом регистра не обнаруживает cygwin - person Oh My Goodness; 05.09.2019

К вашему сведению, на компьютерах Mac $ ^ O теперь возвращает darwin для 10.13.6 (High Sierra) и 10.15.4 (Catalina).

person Amer Neely    schedule 08.04.2020

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

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

person Randall    schedule 17.10.2018

да, использование модуля Config может быть полезным. Еще одна возможность - получить информацию из файлов выпуска / 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"
person GC 13    schedule 02.09.2013
comment
А как насчет окон? - person Toto; 02.09.2013
comment
@ M42 использовать Win32; #module для взаимодействия с Win32 API. ‹br/› Win32 :: GetOSName () - вернет имя ОС ‹br/› Win32 :: GetOSVersion () ‹br/› [CORE] Возвращает список (STRING, MAJOR, MINOR, BUILD, ID), где элементами являются, соответственно: произвольная описательная строка, основной номер версии операционной системы, дополнительный номер версии, номер сборки и цифра, обозначающая фактическую операционную систему. ‹Br/› Вы получите такой o / p ‹br/› ‹s21.postimg.org/ ymuhihbsn / win32_os_info_perl.jpg ›‹ br ›для получения дополнительной информации о модуле Win32: ‹br/› ‹search.cpan.org/~jdb/Win32-0.47/Win32.pm - person GC 13; 11.09.2013
comment
Конечно, но такого файла, как /etc/os-release, нет, и вы заранее не знаете, на какой платформе вы находитесь. - person Toto; 11.09.2013
comment
Думаю, вы не поняли вопроса. Он спрашивает: Как я могу определить операционную систему в Perl ?. Ваше решение не отвечает. - person Toto; 12.09.2013
comment
Извините, я был в режиме редактирования, Hi @ M42, семейства Unix и DOS имеют много разных вещей. для Windows введите msinfo32 в cmd.exe или перенаправьте o / p в файл msinfo32 /nfo C:\TEMP\windows_info.nfo - person GC 13; 12.09.2013
comment
@ M42, тоже поможет my ( $osvername, $major, $minor, $build, $id ) = Win32::GetOSVersion(); print "\n\nOS version - $osvername\nMajor # - $major\nMinor # - $minor\nBuild - $build\nID - $id \n\n"; - person GC 13; 12.09.2013