¿Cómo puedo detectar el sistema operativo en Perl?


Tengo Perl en Mac, Windows y Ubuntu. ¿Cómo puedo saber desde dentro del guión cuál es cuál? Gracias de antemano.

Edit: Me preguntaron qué estoy haciendo. Es un script, parte de nuestro sistema de construcción multiplataforma. El script recurre a los directorios y determina qué archivos construir. Algunos archivos son específicos de la plataforma, y por lo tanto, en Linux no quiero construir los archivos que terminan con _win.cpp, etc.

Author: mxcl, 2008-12-02

9 answers

Examinar la $^O variable que contendrá el nombre del sistema operativo:

print "$^O\n";

Que imprime linux en Linux y MSWin32 en Windows.

También puede referirse a esta variable por el nombre $OSNAME si utiliza el módulo English :

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

Según perlport, $^O será darwin en Mac OS X.


También puede utilizar el módulo Config core, que puede proporcionar lo mismo información (y mucho más):

use Config;

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

Que en mi máquina Ubuntu imprime:

linux
i486-linux-gnu-thread-multi

Tenga en cuenta que esta información se basa en el sistema en el que Perl fue construido, que no es necesariamente el sistema en el que Perl se está ejecutando actualmente (lo mismo es cierto para $^O y $OSNAME); el sistema operativo probablemente no será diferente, pero cierta información, como el nombre de la arquitectura, puede muy bien serlo.

 75
Author: Robert Gamble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-30 01:22:40

Si necesita información más específica sobre Windows, esto puede ayudar.

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

Derivado de sysinfo.t , que escribí la versión original.

Si necesita información más detallada:

my ( $osvername, $major, $minor, $id ) = Win32::GetOSVersion();
 11
Author: Brad Gilbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-30 01:13:37

Sys:: Info:: OS parece una solución potencial relativamente limpia, pero actualmente no parece ser compatible con Mac. Sin embargo, no debería ser demasiado trabajo agregar eso.

 7
Author: Leon Timmermans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-30 01:10:20

La variable ^ ^ O (que es una 'O' mayúscula, no un cero) contiene el nombre del sistema operativo.

Dependiendo de lo que quieras, puede o no dar la respuesta que quieras - en mi sistema da 'linux' sin decir qué distro. No estoy tan seguro de lo que dice en Windows o macOS.

 3
Author: Geoglyph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-02 17:10:07

Mira dentro de la fuente para File::Spec para ver cómo carga el delegado correcto basado en el sistema operativo. :)

File::Spec tiene un archivo de módulo Perl separado para cada sistema operativo. File::Spec::Win32, File::Spec::OS2, etc...

Comprueba el sistema operativo y cargará el archivo .pm apropiado en tiempo de ejecución basado en el sistema operativo.

# 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");
 3
Author: brian d foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 14:47:15

Aquí está una referencia rápida sobre cómo encontrar el sistema operativo que la máquina local está ejecutando desde Perl.

La variable ^ ^ O (OST OSTYPE si usa inglés) contiene el sistema operativo para el que se construyó su binario perl.

 2
Author: willasaywhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-02 17:06:04

Un clásico de una sola línea:

my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
 1
Author: Hawk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-16 15:49:38
#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
Author: bcarroll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-23 15:34:07

Sí usar el módulo de configuración puede ser algo bueno. Una posibilidad más es obtener la información de/etc / *release files

Por ejemplo..

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"
 -2
Author: GC 13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-02 09:16:01