¿Cómo puedo detectar el sistema operativo en Perl?
cross-platform (9)
Busque en el origen de 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");
Tengo Perl en Mac, Windows y Ubuntu. ¿Cómo puedo decir desde dentro del script cuál es cuál? Gracias por adelantado.
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 no quiero compilar los archivos que terminan en _win.cpp, etc.
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 desea, en mi sistema da ''linux'' sin decir qué distribución. No estoy tan seguro de lo que dice en Windows o MacOS.
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();
Un clásico delineador:
my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
sí, usar el módulo de configuración puede ser algo bueno. Una posibilidad más es obtener la información de los archivos de lanzamiento / etc / *
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"
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.
Here''s una referencia rápida sobre cómo encontrar el sistema operativo que ejecuta la máquina local desde Perl.
La variable $ ^ O ($ OSTYPE si usa inglés) contiene el sistema operativo para el que se creó su binario de Perl.
Examine 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 referirse a esta variable con el nombre $^O si usa el módulo en English :
use English qw'' -no_match_vars '';
print "$OSNAME/n";
Según perlport , $^O
será darwin
en Mac OS X.
También puede usar el módulo de núcleo de Config , que puede proporcionar la misma 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 se creó Perl, que no es necesariamente el sistema en el que Perl se está ejecutando (lo mismo vale para $^O
y $^O ); el sistema operativo no será probablemente diferente, pero cierta información, como el nombre de la arquitectura, muy bien puede ser.
#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;