2008-12-02 33 views
53

Tôi có Perl trên Mac, Windows và Ubuntu. Làm thế nào tôi có thể nói từ bên trong kịch bản đó là cái nào? Cảm ơn trước.Làm thế nào tôi có thể phát hiện hệ điều hành trong Perl?

Chỉnh sửa: Tôi được hỏi tôi đang làm gì. Nó là một kịch bản, một phần của hệ thống xây dựng đa nền tảng của chúng tôi. Kịch bản lệnh đệ quy các thư mục và tìm ra các tệp cần xây dựng. Một số tập tin là nền tảng cụ thể, và do đó, trên Linux Tôi không muốn xây dựng các tập tin kết thúc với _win.cpp vv

+1

Tại sao bạn cần phải biết? [Có thể có câu trả lời phù hợp hơn cho câu hỏi của bạn, tùy thuộc vào cái gì (nếu có) bạn đang làm phụ thuộc vào nền tảng.] – Rob

Trả lời

73

Kiểm tra $^O biến mà sẽ chứa tên của hệ điều hành:

print "$^O\n"; 

Bản in nào linux trên Linux và MSWin32 trên Windows.

Bạn cũng có thể tham khảo để biến này bằng tên $OSNAME nếu bạn sử dụng các mô-đun English:

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

Theo perlport, $^O sẽ darwin trên Mac OS X.


Bạn cũng có thể sử dụng mô-đun lõi Config, có thể cung cấp cùng một thông tin (và nhiều hơn nữa):

use Config; 

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

nào trên máy tính Ubuntu in của tôi:

linux 
i486-linux-gnu-thread-multi 

Lưu ý rằng thông tin này được dựa trên hệ thống mà Perl là xây dựng, mà không nhất thiết phải là hệ thống Perl hiện đang chạy trên (cùng là đúng cho $^O$OSNAME); hệ điều hành sẽ không có khả năng khác nhau nhưng một số thông tin, như tên kiến ​​trúc, có thể rất tốt.

+1

Cảm ơn :) Và đối với những người khác có thể sử dụng câu trả lời này, cygwin perl sẽ trả về "cygwin ", do đó, có hai khả năng cho Windows. – mxcl

+2

Nhiều hơn hai; có một cổng dos và cổng os2 được sử dụng để có thể chạy trên các cửa sổ. Tất cả các giá trị có thể có của $^O là trong lý thuyết được ghi lại trong . – ysth

+0

in "$^O \ n"; thực sự in "darwin" trên hệ thống Mac OS X của tôi. – ShreevatsaR

2

Here's tham khảo nhanh về cách tìm hệ điều hành mà máy cục bộ đang chạy từ Perl.

Biến $^O ($ OSTYPE nếu bạn sử dụng tiếng Anh) chứa hệ điều hành mà nhị phân perl của bạn được tạo.

3

Biến $^O (đó là số vốn 'O', không phải số không) giữ tên của hệ điều hành.

Tùy thuộc vào những gì bạn muốn, nó có thể hoặc có thể không đưa ra câu trả lời bạn muốn - trên hệ thống của tôi, nó cung cấp 'linux' mà không nói phân phối. Tôi không chắc chắn về những gì nó nói trên Windows hoặc MacOS.

7

Sys::Info::OS trông giống như một giải pháp tiềm năng tương đối sạch, nhưng hiện tại dường như không hỗ trợ Mac. Nó không phải là quá nhiều công việc để thêm rằng mặc dù.

+0

Điều này sẽ là một câu trả lời tốt hơn, nếu chỉ nó sẽ hỗ trợ Mac. Tôi thích các chức năng hỗ trợ trình biên dịch, cho các chuỗi sự cố bảo trì. – mxcl

+0

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

2

Nhìn bên trong nguồn cho File::Spec để xem cách tải đại biểu phù hợp dựa trên hệ điều hành. :)

File::Spec có tệp mô-đun Perl riêng cho từng hệ điều hành. File::Spec::Win32, File::Spec::OS2, v.v ...

Nó sẽ kiểm tra hệ điều hành và sẽ tải tệp .pm thích hợp vào thời gian chạy dựa trên hệ điều hành.

# 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

Đây có lẽ là câu trả lời hay nhất cho tất cả những điều này. Thật không may nó không được bình chọn là phổ biến bởi vì không ai muốn làm bất kỳ nghiên cứu của riêng mình ngoài Stack Overflow. Tôi sẽ thêm vào câu trả lời để những người lười biếng không phải trải qua tất cả những công việc khó nhọc khi nhấp vào một liên kết. : P – tjwrona1992

10

Nếu bạn cần thêm thông tin cụ thể về Windows, điều này có thể hữu ích.

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

Xuất phát từ sysinfo.t, mà tôi đã viết phiên bản gốc.

Nếu bạn cần thông tin chi tiết hơn:

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

win32 sử dụng chức năng không dùng nữa GetVersionExA. Điều này không làm việc vor Phiên bản> 6.2 –

+0

@MayraDelgado Thật vậy, và có vẻ như không có thay thế trực tiếp. Đó là lý do tại sao một người cần điều này nên tìm ra cách để sửa chữa nó và cung cấp một yêu cầu kéo. Tôi hiếm khi sử dụng Windows nữa, vì vậy nó không có khả năng là tôi. –

1

Một cổ điển một liner:

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

Trừ khi bạn đang chạy darwin os! –

+0

Crap! Bạn đúng! Làm cho trường hợp nhạy cảm dường như sửa chữa nó. Tôi đã sửa nó ở trên. Nắm bắt tốt! – 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

có sử dụng mô-đun cấu hình có thể là một điều tốt. Một khả năng nữa là nhận được thông tin từ/etc/* phiên bản tập tin

cho ví dụ ..

cat/etc/os-phát hành

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

Còn cửa sổ thì sao? – Toto

+0

@ M42 sử dụng Win32; #module để tương tác với API win32.
Win32 :: GetOSName() - sẽ trả về tên hệ điều hành
Win32 :: GetOSVersion()
[CORE] Trả về danh sách (STRING, MAJOR, MINOR, BUILD, ID), trong đó các phần tử tương ứng: An chuỗi mô tả tùy ý, số phiên bản chính của hệ điều hành, số phiên bản phụ, số bản dựng và chữ số cho biết hệ điều hành thực tế.
Bạn sẽ nhận được như vậy o/p

để biết thêm thông tin abot mô-đun Win32:

+0

Chắc chắn, nhưng không có tập tin như '/ etc/os-release' và bạn không biết trước bạn đang ở nền tảng nào. – Toto

Các vấn đề liên quan