2008-12-02 22 views
53

Tengo Perl en Mac, Windows y Ubuntu. ¿Cómo puedo decir desde dentro del script cuál es cuál? Gracias por adelantado.¿Cómo puedo detectar el sistema operativo en Perl?

Editar: Me preguntaron qué estoy haciendo. Es un script, parte de nuestro sistema de compilación multiplataforma. El script recursifica directorios y descubre qué archivos crear. Algunos archivos son específicos de la plataforma, y ​​por lo tanto, en Linux que no quieren construir los archivos terminando con _win.cpp, etc.

+1

¿Por qué necesita saber? [Puede haber una respuesta más adecuada a su pregunta, dependiendo de qué (si es que algo) está haciendo depende de la plataforma.] – Rob

Respuesta

73

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

print "$^O\n"; 

Que imprime linux en Linux y MSWin32 en Windows.

También puede hacer referencia a esta variable con el nombre $OSNAME si se utiliza el módulo de English:

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

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


Usted también puede usar el módulo principal Config, que puede proporcionar la misma información (y mucho más):

use Config; 

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

Cuál de mis impresiones de la máquina de Ubuntu:

linux 
i486-linux-gnu-thread-multi 

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

+1

Gracias :) Y para otras personas que puedan usar esta respuesta, cygwin perl devuelve "cygwin ", entonces hay dos posibilidades para Windows. – mxcl

+2

Más de dos; había un puerto dos, y el puerto os2 solía poder ejecutarse en Windows. Todos los valores posibles de $^O están, en teoría, documentados en . – ysth

+0

print "$^O \ n"; de hecho imprime "darwin" en mi Mac OS X sysem. – ShreevatsaR

2

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

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

3

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

Dependiendo de lo que quiera, puede dar o no la respuesta que desee, en mi sistema da 'linux' sin decir qué distribución. No estoy tan seguro de lo que dice en Windows o MacOS.

7

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.

+0

Esta habría sido una mejor respuesta, si solo fuera compatible con Mac. Prefiero las funciones asistidas por el compilador, a las cadenas de problemas de mantenimiento. – mxcl

+0

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

2

Busque en el código fuente File::Spec para ver cómo carga el delegado correcto según el sistema operativo. :)

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

Comprueba el sistema operativo y cargará el archivo .pm apropiado en el 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"); 
+0

Esta es probablemente la mejor respuesta de todas estas. Desafortunadamente no ha sido votado como popular porque nadie quiere investigar por su cuenta más allá de Stack Overflow. Voy a agregar a la respuesta para que las personas perezosas no tengan que pasar por todo el arduo trabajo de hacer clic en un enlace. : P – tjwrona1992

10

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

obtenidos por medios sysinfo.t, que escribí la versión original.

Si necesita información más detallada:

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

win32 usa una función en desuso GetVersionExA. Esto no funciona vor Version> 6.2 –

+0

@MayraDelgado De hecho, y parece que no hay un reemplazo directo. Por eso, alguien que necesita esto debería encontrar la manera de solucionarlo y proporcionar una solicitud de extracción. Raramente utilizo Windows nunca más, así que no es probable que sea yo. –

1

Un clásico de una sola línea:

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

Excepto si está ejecutando darwin os! –

+0

¡Mierda! ¡Tienes razón! Hacer que sea sensible a mayúsculas parece solucionarlo. Lo he corregido arriba. ¡Buena atrapada! – 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

sí usando el módulo de configuración puede ser una buena cosa. Una posibilidad es cada vez más la información de/etc/* Los archivos de liberación

por ejemplo ..

cat/etc/os de liberación

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

¿Y qué hay de las ventanas? – Toto

+0

@ M42 use Win32; #module para interactuar con la API de win32.
Win32 :: GetOSName() - devolverá el nombre del sistema operativo
Win32 :: GetOSVersion()
[Core] Devuelve la lista (cadena, mayor, menor, CONSTRUIR, ID), donde los elementos son, respectivamente: Un cadena descriptiva arbitraria, el número de versión principal del sistema operativo, el número de versión menor, el número de compilación y un dígito que indica el sistema operativo real.
Obtendrá tal o/p

para más información abot Módulo Win32:

+0

Claro, pero no hay un archivo como '/ etc/os-release' y usted no sabe de antemano en qué plataforma se encuentra. – Toto

Cuestiones relacionadas