web-dev-qa-db-fra.com

Comment détecter le système d'exploitation dans Perl?

J'ai Perl sur Mac, Windows et Ubuntu. Comment savoir à partir du script lequel est lequel? Merci d'avance.

Edit: / On m'a demandé ce que je fais. C'est un script, une partie de notre système de construction multi-plateforme. Le script recycle les répertoires et détermine les fichiers à créer. Certains fichiers sont spécifiques à la plate-forme et donc, sous Linux, je ne souhaite pas construire les fichiers se terminant par _win.cpp, etc.

54
mxcl

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

print "$^O\n";

Ce qui imprime linux sous Linux et MSWin32 sous Windows.

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

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

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


Vous pouvez également utiliser le module Config core, qui peut fournir les mêmes informations (et bien d’autres):

use Config;

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

Qui sur ma machine Ubuntu imprime:

linux
i486-linux-gnu-thread-multi

Notez que ces informations sont basées sur le système sur lequel Perl était construit, ce qui ne correspond pas nécessairement au système sur lequel Perl est actuellement exécuté (il en va de même pour $^O et $OSNAME ); le système d'exploitation ne sera probablement pas différent, mais certaines informations, telles que le nom de l'architecture, peuvent très bien l'être.

76
Robert Gamble

Si vous avez besoin d'informations plus spécifiques sur Windows, cela peut vous 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();
12
Brad Gilbert

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

7
Leon Timmermans

Dans le code source, recherchez File::Spec pour voir comment il charge le délégué approprié en fonction du système d'exploitation. :)

File::Spec a 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");
5
brian d foy

La variable $ ^ O (c'est un «O» majuscule, 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 distribution. Je ne suis pas sûr de ce que cela dit sous Windows ou MacOS.

3
Geoglyph

Voici une référence rapide sur la façon de trouver le système d'exploitation que la machine locale exécute à partir de Perl.

La variable $ ^ O ($ OSTYPE si vous utilisez l'anglais) contient le système d'exploitation pour lequel votre fichier binaire Perl a été créé. 

2
willasaywhat

Un one-liner classique:

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

Pour un mappage générique dans un module Perl préemballé, consultez Perl::OSType

Il est utilisé par Module::Build.

0
Randall