Comment puis-je détecter le système d’exploitation en Perl?

J’ai Perl sur Mac, Windows et Ubuntu. Comment puis-je savoir à l’intérieur du script lequel est lequel? Merci d’avance.

Edit: On m’a demandé ce que je faisais. C’est un script qui fait partie de notre système de construction multi-plateforme. Le script recurse les répertoires et détermine quels fichiers construire. Certains fichiers sont spécifiques à une plate-forme et, par conséquent, sous Linux, je ne veux pas construire les fichiers se terminant par _win.cpp, etc.

Examinez la variable $^O qui contiendra le nom du système d’exploitation:

 print "$^O\n"; 

Qui imprime linux sur Linux et MSWin32 sur Windows.

Vous pouvez également faire référence à cette variable par le nom $OSNAME si vous utilisez le module anglais :

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

Selon perlport , $^O sera darwin sur Mac OS X.


Vous pouvez également utiliser le module de base Config , qui peut fournir les mêmes informations (et beaucoup plus):

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

Qui sur ma machine Ubuntu imprime:

 linux i486-linux-gnu-thread-multi 

Notez que cette information est basée sur le système sur lequel Perl a été construit , qui n’est pas nécessairement le système sur lequel Perl est en cours d’exécution (la même chose est vraie pour $^O et $OSNAME ); le système d’exploitation ne sera probablement pas différent, mais certaines informations, comme le nom de l’architecture, peuvent très bien être.

Si vous avez besoin d’informations plus spécifiques sur Windows, cela peut aider.

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

Dérivé de sysinfo.t , dont j’ai écrit la version originale.

Si vous avez besoin d’informations plus détaillées:

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

Sys :: Info :: OS ressemble à une solution potentielle relativement propre, mais ne semble pas actuellement prendre en charge Mac. Cela ne devrait pas être trop de travail d’append cela.

La variable $ ^ O (c’est un ‘O’ capital, pas un zéro) contient le nom du système d’exploitation.

Selon ce que vous voulez, il peut ou non donner la réponse que vous voulez – sur mon système, il donne «linux» sans dire quelle dissortingbution. Je ne suis pas sûr de ce qu’il dit sur Windows ou MacOS.

Regardez dans la source pour File::Spec pour voir comment elle charge le bon délégué en fonction du système d’exploitation. 🙂

File::Spec possède un fichier de module Perl distinct pour chaque système d’exploitation. File::Spec::Win32 , File::Spec::OS2 , etc …

Il vérifie le système d’exploitation et charge le fichier .pm approprié au moment de l’exécution, en fonction du système d’exploitation.

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

Voici une référence rapide sur la façon de trouver le système d’exploitation sur lequel l’ordinateur local s’exécute à partir de Perl.

La variable $ ^ O ($ OSTYPE si vous utilisez l’anglais) contient le système d’exploitation pour lequel votre binary perl a été construit.

Un one-liner classique:

 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 (){ print $_; } close FILE; 

Oui, l’utilisation du module Config peut être une bonne chose. Une autre possibilité est d’obtenir les informations des fichiers de version / etc / *

pour par exemple ..

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"