2012-01-15 36 views
10

Tôi muốn mở một URL, chẳng hạn như http://www.example.com/, ở cuối tập lệnh Perl. Tôi không muốn truy cập nó với WWW :: Mechanize nhưng thực sự hiển thị trang web cho người dùng trong một trình duyệt web đồ họa.Làm cách nào để khởi chạy trình duyệt web mặc định trong Perl trên bất kỳ hệ điều hành nào?

Có nhiều cách để thực hiện điều này trong Mac (open URL) và Windows, nhưng tôi muốn một giải pháp hoạt động trên mọi hệ điều hành, không chỉ một hệ điều hành.

Trả lời

17

Các hit thứ hai trên "open url" at search.cpan sẽ trả Browser::Open:

use Browser::Open qw(open_browser); 

my $url = 'http://www.google.com/'; 
open_browser($url); 

Nếu hệ điều hành của bạn không được hỗ trợ, gửi một bản vá hoặc một báo cáo lỗi.

+0

Trình duyệt :: Mở không hoạt động cho Cygwin. Nó chỉ sử dụng 'bắt đầu' không phải 'cygstart'. – Chloe

+1

@Chloe, vâng, đó là [một lỗi trong Trình duyệt :: Mở] (https://rt.cpan.org/Public/Bug/Display.html?id=85972). Hy vọng rằng, nó sẽ được sửa chữa sớm. – cjm

8

Bạn có thể sử dụng biến số $^O để xác định nền tảng và sử dụng các lệnh khác nhau cho từng hệ điều hành.

Ví dụ:

sub open_default_browser { 
    my $url = shift; 
    my $platform = $^O; 
    my $cmd; 
    if ($platform eq 'darwin') { $cmd = "open \"$url\"";   } # Mac OS X 
    elsif ($platform eq 'linux') { $cmd = "x-www-browser \"$url\""; } # Linux 
    elsif ($platform eq 'MSWin32') { $cmd = "start $url";    } # Win95..Win7 
    if (defined $cmd) { 
    system($cmd); 
    } else { 
    die "Can't locate default browser"; 
    } 
} 

open_default_browser("http://www.example.com/"); 
+2

Tại sao phải viết lại trình duyệt :: Mở? – cjm

+2

Tùy thuộc vào nơi tập lệnh sẽ được sử dụng. Nếu nó là một tập lệnh duy nhất, nó sẽ sử dụng ít phụ thuộc bên ngoài hơn cho tính di động tốt hơn. Tuy nhiên, các mô-đun có thể cùng với kịch bản và trong trường hợp này, tốt hơn nên sử dụng 'Browser :: Open'. – Taras

+1

Nếu chạy lệnh này từ "git bash" $ platform eq "msys" –

1

Nếu cài đặt CPAN mô-đun Browser::Open không phải là một lựa chọn hay không mong muốn, Taras' answer cung cấp một lựa chọn tốt, nhưng có thể được cải thiện trong các cách sau:

  • làm cho chức năng hoạt động mạnh mẽ trên Windows với các URL chứa các siêu ký tự shell như &^.
  • trên Windows, hỗ trợ thêm cho các MSYS, Git Bash, và môi trường Unix-thi đua Cygwin
  • thêm hỗ trợ cho hệ điều hành bổ sung mà còn có các tiện ích xdg-open, cụ thể là tất cả các HĐH có freedesktop.org -tương thích, ví dụ, sử dụng giao diện đồ họa dựa trên X Window, bao gồm các nền tảng không phải Linux như PC-BSD (FreeBSD-based) và OpenSolaris.
# SYNOPSIS 
# openurl <url> 
# DESCRIPTION 
# Opens the specified URL in the system's default browser. 
# COMPATIBILITY 
# OSX, Windows (including MSYS, Git Bash, and Cygwin), as well as Freedesktop-compliant 
# OSs, which includes many Linux distros (e.g., Ubuntu), PC-BSD, OpenSolaris... 
sub openurl { 
    my $url = shift; 
    my $platform = $^O; 
    my $cmd; 
    if ($platform eq 'darwin') { $cmd = "open \"$url\"";  } # OS X 
    elsif ($platform eq 'MSWin32' or $platform eq 'msys') { $cmd = "start \"\" \"$url\""; } # Windows native or MSYS/Git Bash 
    elsif ($platform eq 'cygwin') { $cmd = "cmd.exe /c start \"\" \"$url \""; } # Cygwin; !! Note the required trailing space. 
    else { $cmd = "xdg-open \"$url\""; } # assume a Freedesktop-compliant OS, which includes many Linux distros, PC-BSD, OpenSolaris, ... 
    if (system($cmd) != 0) { 
    die "Cannot locate or failed to open default browser; please open '$url' manually."; 
    } 
} 

Cygwin caveat: Bizarrely, cách duy nhất để bảo vệ các URL được chuyển đến cmd.exe từ giải thích các ký tự. chẳng hạn như &^nối thêm dấu cách. Điều này hoạt động trong tất cả trừ một trường hợp cạnh, tuy nhiên, hiếm khi xảy ra trong thế giới thực: nếu URL chứa một cái gì đó như %FOO% và biến môi trường có tên FOOtồn tại, %FOO% vô tình được mở rộng.

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