web-dev-qa-db-ja.com

Perlでオペレーティングシステムを検出するにはどうすればよいですか?

Mac、Windows、UbuntuにPerlがあります。どれがどれであるかをスクリプト内からどのように確認できますか?前もって感謝します。

編集:私は何をしているのか尋ねられました。これはスクリプトであり、クロスプラットフォームビルドシステムの一部です。このスクリプトはディレクトリを再帰的に作成し、構築するファイルを特定します。一部のファイルはプラットフォーム固有であるため、Linuxでは、_win.cppなどで終わるファイルをビルドしたくありません。

54
mxcl

$^O オペレーティングシステムの名前を含む変数:

print "$^O\n";

LinuxでlinuxMSWin32 Windowsの場合。

この変数を名前で参照することもできます $OSNAME英語 モジュールを使用する場合:

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

perlport$^O は、Mac OS Xではdarwinになります。


Config コアモジュールを使用することもできます。これにより、同じ情報(およびそれ以上)を提供できます。

use Config;

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

私のUbuntuマシンで印刷されるもの:

linux
i486-linux-gnu-thread-multi

この情報は、Perlがbuiltであったシステムに基づいていることに注意してください。これは必ずしもPerlが現在実行されているシステムではありません(同じことは- $^O および $OSNAME ); OSに違いはありませんが、アーキテクチャ名などの一部の情報は非常に異なる可能性があります。

77
Robert Gamble

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();
12
Brad Gilbert

Sys :: Info :: OS は比較的クリーンなソリューションのように見えますが、現在はMacをサポートしていないようです。ただし、それを追加するのはあまり手間がかかりません。

7
Leon Timmermans

File::Spec のソースを調べて、オペレーティングシステムに基づいて適切なデリゲートをロードする方法を確認します。 :)

File::Specには、OSごとに個別のPerlモジュールファイルがあります。 File::Spec::Win32File::Spec::OS2など...

オペレーティングシステムをチェックし、OSに基づいて実行時に適切な.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");
6
brian d foy

変数$ ^ O(ゼロではなく大文字の「O」)には、オペレーティングシステムの名前が保持されます。

あなたが望むものに応じて、それはあなたが望む答えを与えるかもしれないし、そうでないかもしれない-私のシステムでは、どのディストリビューションも言わずに 'linux'を与える​​。 WindowsやMacOSで何と言っているのかよくわかりません。

3
Geoglyph

こちら ローカルマシンがPerlから実行しているOSを見つける方法のクイックリファレンス。

$ ^ O変数(英語を使用する場合は$ OSTYPE)には、Perlバイナリが構築されたオペレーティングシステムが含まれています。

2
willasaywhat

古典的なワンライナー:

my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
1
Hawk
#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;
0
bcarroll

事前にパッケージ化されたPerlモジュールでの汎用マッピングについては、 Perl::OSType を確認してください。

Module::Buildによって使用されます。

0
Randall