2008-12-02 10 views
53

Ich habe Perl auf Mac, Windows und Ubuntu. Wie kann ich innerhalb des Drehbuchs erkennen, wer welcher ist? Danke im Voraus.Wie kann ich das Betriebssystem in Perl erkennen?

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 und damit auf Linux Ich möchte nicht die Dateien mit der Endung _win.cpp bauen usw.

+1

Warum müssen Sie wissen? [Es kann eine passendere Antwort auf Ihre Frage geben, abhängig davon, was (wenn überhaupt) Sie tun, dass plattformabhängig ist.] – Rob

Antwort

73

Untersuchen Sie die $^O Variable, die den Namen des Betriebssystems enthalten:

print "$^O\n"; 

Welche Drucke linux unter Linux und MSWin32 unter Windows.

Sie können auch unter dem Namen $OSNAME auf diese Variable verweisen, wenn Sie das English Modul verwenden:

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

bis Nach perlport wird $^Odarwin auf Mac OS X.

sein

Sie kann auch die Config Kernmodul verwenden, die die gleichen Informationen (und viel mehr) zur Verfügung stellen können:

use Config; 

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

, die auf meiner Ubuntu-Maschine druckt:

linux 
i486-linux-gnu-thread-multi 

Beachten Sie, dass diese Informationen auf dem System basiert, das Perl war gebaut, was nicht unbedingt das System Perl ist derzeit ausgeführt wird (das gleiche ist wahr für $^O und $OSNAME); Das Betriebssystem wird wahrscheinlich nicht anders sein, aber einige Informationen, wie der Name der Architektur, können sehr gut sein.

+1

Danke :) Und für andere Leute, die diese Antwort verwenden können, gibt cygwin perl "cygwin zurück ", so gibt es zwei Möglichkeiten für Windows. – mxcl

+2

Mehr als zwei; Es gab einen DOS-Port, und der OS2-Port konnte unter Windows laufen. Alle möglichen Werte von $^O sind theoretisch in dokumentiert. – ysth

+0

print "$^O \ n"; druckt tatsächlich "darwin" auf meinem Mac OS X-System. – ShreevatsaR

2

Here's eine schnelle Referenz, wie das Betriebssystem die lokale Maschine von Perl läuft zu finden.

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

3

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

Je nachdem, was Sie wollen, kann es die gewünschte Antwort geben oder nicht - auf meinem System gibt es "Linux", ohne zu sagen, welche Distribution. Ich bin mir nicht sicher, was es auf Windows oder MacOS sagt.

7

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

+0

Das wäre eine bessere Antwort gewesen, wenn es nur Mac unterstützen würde. Ich bevorzuge die Compiler-unterstützten Funktionen zu den Maintenance-Problem-Strings. – mxcl

+0

http://search.cpan.org/perldoc?Sys::Info::OS –

2

Suchen Sie in der Quelle nach File::Spec, um zu sehen, wie es den richtigen Delegaten basierend auf dem Betriebssystem lädt. :)

File::Spec verfügt über eine separate Datei Perl-Modul für jedes Betriebssystem. File::Spec::Win32, File::Spec::OS2, etc ...

Es überprüft das Betriebssystem und lädt die entsprechende Datei .pm zur Laufzeit auf Betriebssystembasis.

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

Dies ist wahrscheinlich die beste Antwort von all diesen. Leider wird es nicht so beliebt gewählt, weil niemand über Stack Overflow hinaus selbst recherchieren möchte. Ich werde zu der Antwort hinzufügen, so dass faule Leute nicht alle die harte Arbeit durchmachen müssen, auf einen Link zu klicken. : P – tjwrona1992

10

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

von sysinfo.t abgeleitet, die ich die ursprüngliche Version geschrieben.

Wenn Sie detailliertere Informationen benötigen:

my ($osvername, $major, $minor, $id) = Win32::GetOSVersion(); 
+0

win32 verwendet eine veraltete Funktion GetVersionExA. Dies funktioniert nicht vor Version> 6.2 –

+0

@MayraDelgado In der Tat, und es sieht so aus, als ob es keinen direkten Ersatz gibt. Deshalb sollte jemand, der dies benötigt, herausfinden, wie er es beheben und eine Pull-Anfrage stellen kann. Ich benutze Windows sowieso selten mehr, also ist es wahrscheinlich nicht ich. –

1

Ein klassischer Einzeiler:

my $windows=($^O=~/Win/)?1:0;# Are we running on windows? 
+6

Außer wenn Sie Darwin OS ausführen! –

+0

Mist! Du hast recht! Wenn Sie die Groß- und Kleinschreibung beachten, scheint das Problem zu beheben. Ich habe es oben korrigiert. Guter Fang! – Hawk

0
#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; 
-2

ja Config-Modul kann eine gute Sache sein. Eine weitere Möglichkeit ist immer die Informationen von/etc/* Release-Dateien

für zB ..

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" 
+1

Und was ist mit Windows? – Toto

+0

@ M42 Verwenden Sie Win32; #Modul zur Interaktion mit der Win32 API.
Win32 :: GetOSName() - kehrt die OS Name
Win32 :: GetOSVersion()
[CORE] Gibt die Liste (STRING, Dur, Moll, BUILD, ID), wo die Elemente sind jeweils: Ein beliebige beschreibende Zeichenfolge, die Hauptversionsnummer des Betriebssystems, die Nebenversionsnummer, die Build-Nummer und eine Ziffer, die das aktuelle Betriebssystem angibt.
Sie erhalten eine solche o/p

für weitere Informationen abot Win32-Modul:

+0

Sicher, aber es gibt keine solche Datei wie '/ etc/os-release' und Sie wissen nicht im Voraus, auf welcher Plattform Sie sind. – Toto

Verwandte Themen