it-swarm.com.de

Wie kann ich das Betriebssystem in Perl erkennen?

Ich habe Perl auf Mac, Windows und Ubuntu. Wie kann ich im Skript erkennen, wer welches ist? Danke im Voraus.

Edit: Ich wurde gefragt, was ich mache. Es ist ein Skript, Teil unseres plattformübergreifenden Build-Systems. Das Skript rekursiert Verzeichnisse und ermittelt, welche Dateien erstellt werden sollen. Einige Dateien sind plattformspezifisch. Daher möchte ich unter Linux keine Dateien erstellen, die mit _win.cpp enden.

54
mxcl

Untersuchen Sie die Variable $^O , die den Namen des Betriebssystems enthält:

print "$^O\n";

Welche gibt linux unter Linux und MSWin32 unter Windows aus.

Sie können diese Variable auch mit dem Namen $OSNAME referenzieren, wenn Sie das Modul English verwenden:

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

Gemäß perlport wird $^O unter Mac OS X darwin sein.


Sie können auch das Config core-Modul verwenden, das die gleichen Informationen (und vieles mehr) bereitstellt:

use Config;

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

Was auf meinem Ubuntu-Gerät gedruckt wird:

linux
i486-linux-gnu-thread-multi

Beachten Sie, dass diese Informationen auf dem System basieren, das Perl built war. Dies ist nicht notwendigerweise das System, auf dem Perl derzeit ausgeführt wird (dasselbe gilt für $^O und $OSNAME ); Das Betriebssystem wird sich wahrscheinlich nicht unterscheiden, aber einige Informationen, wie der Name der Architektur, können sehr gut sein.

76
Robert Gamble

Wenn Sie genauere Informationen zu Windows benötigen, kann dies hilfreich sein.

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/;
}}

Abgeleitet von sysinfo.t , wobei ich die Originalversion geschrieben habe.

Wenn Sie detailliertere Informationen benötigen:

my ( $osvername, $major, $minor, $id ) = Win32::GetOSVersion();
12
Brad Gilbert

Sys :: Info :: OS sieht aus wie eine relativ saubere potenzielle Lösung, scheint aber momentan keinen Mac zu unterstützen. Es sollte jedoch nicht zu viel Arbeit sein, um das hinzuzufügen.

7
Leon Timmermans

Schauen Sie in der Quelle nach File::Spec , um zu sehen, wie der richtige Delegat basierend auf dem Betriebssystem geladen wird. :)

File::Spec hat für jedes Betriebssystem eine eigene Perl-Moduldatei. File::Spec::Win32, File::Spec::OS2, etc ...

Es prüft das Betriebssystem und lädt die entsprechende .pm-Datei zur Laufzeit basierend auf dem Betriebssystem.

# 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");
5
brian d foy

Die Variable $ ^ O (das ist ein '0', keine Null) enthält den Namen des Betriebssystems.

Je nachdem, was Sie möchten, kann es die Antwort geben, die Sie möchten - auf meinem System gibt es "Linux", ohne zu sagen, welche Distribution. Ich bin mir nicht so sicher, was es unter Windows oder Mac OS sagt.

3
Geoglyph

Hier ist eine kurze Referenz, wie Sie das Betriebssystem finden, auf dem der lokale Computer von Perl aus läuft.

Die Variable $ ^ O ($ OSTYPE, wenn Sie Englisch verwenden) enthält das Betriebssystem, für das Ihre Perl-Binärdatei entwickelt wurde. 

2
willasaywhat

Ein klassischer Einliner:

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

Für ein generisches Mapping in einem vorinstallierten Perl-Modul checken Sie Perl::OSType aus. 

Es wird von Module::Build verwendet.

0
Randall