program tip

Perl에서 운영 체제를 어떻게 감지합니까?

radiobox 2021. 1. 7. 07:49
반응형

Perl에서 운영 체제를 어떻게 감지합니까?


Mac, Windows 및 Ubuntu에 Perl이 있습니다. 스크립트 내에서 어떤 것이 무엇인지 어떻게 알 수 있습니까? 미리 감사드립니다.

편집 : 내가 무엇을하는지 물었다. 크로스 플랫폼 빌드 시스템의 일부인 스크립트입니다. 스크립트는 디렉토리를 반복하고 빌드 할 파일을 파악합니다. 일부 파일은 플랫폼별로 다르기 때문에 Linux에서는 _win.cpp 등으로 끝나는 파일을 빌드하고 싶지 않습니다.


$^O운영 체제의 이름을 포함 변수를 조사하십시오 .

print "$^O\n";

linuxLinux 및 MSWin32Windows 에서 인쇄 됩니다 .

영어 모듈 $OSNAME을 사용하는 경우 이름으로이 변수를 참조 할 수도 있습니다 .

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

에 따르면 perlport , $^O될 것입니다 darwin맥 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을 지원하지 않는 것 같습니다. 그러나 그것을 추가하는 것은 너무 많은 작업이어서는 안됩니다.


File::Spec운영 체제에 따라 올바른 대리자를로드하는 방법을 보려면 소스 내부를 살펴보십시오 . :)

File::Spec각 OS에 대해 별도의 Perl 모듈 파일이 있습니다. File::Spec::Win32, File::Spec::OS2등 ...

운영 체제를 확인하고 .pmOS에 따라 런타임에 적절한 파일을 로드합니다 .

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

변수 $ ^ O (즉, 0이 아닌 대문자 'O')는 운영 체제의 이름을 보유합니다.

당신이 원하는 것에 따라, 그것은 당신이 원하는 답을 줄 수도 있고 아닐 수도 있습니다. 제 시스템에서는 어떤 배포판을 말하지 않고 'linux'를 제공합니다. Windows 또는 MacOS에서 무엇을 말하는지 잘 모르겠습니다.


Here's a quick reference on how to find the OS the local machine is running from Perl.

The $^O variable ($OSTYPE if you use English) contains the operating system that your perl binary was built for.


A classic one-liner:

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;

For a generic mapping in a pre-packaged perl module, check out Perl::OSType.

It's used by Module::Build.


yes using Config module can be a good thing. One more possibility is getting the info from /etc/*release files

for eg..

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"

ReferenceURL : https://stackoverflow.com/questions/334686/how-can-i-detect-the-operating-system-in-perl

반응형