2012-08-22 32 views
4

在我們的一個模塊中,我們檢查給定的二進制文件(varnishd)是否存在,如果存在,我們運行其他測試。與perl 5.10.1一樣,IPC :: Open3 :: open3()不適用於perl 5.14.2?

執行檢查,我們使用IPC::Open3,像這樣(例如剝離下來的清晰度):

perl -MIPC::Open3 -le ' 
    my $binary = "varnishd"; 
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V"); 
    waitpid $pid, 0; print $?' 

在Debian擠壓,或Ubuntu納蒂,與的Perl 5.10.1,如果varnishd沒有在系統上找到,這爲我打印65280。 如果將$binary更改爲perl,則(正確)打印0

然而,與Ubuntu精確和的Perl 5.14.2,這不會以同樣的方式工作了,併產生了以下內容:

$ perl -MIPC::Open3 -le ' 
    my $binary = "varnishd"; 
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V"); 
    waitpid $pid, 0; print $?' 
open3: exec of varnishd -V failed at -e line1 

當我改變$binary的東西存在,例如perl,那麼它正常工作並打印0

$ perl -MIPC::Open3 -le ' 
    my $binary = "perl"; 
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V"); 
    waitpid $pid, 0; print $?' 
0 

讀其他的問題和答案,它看起來像我想看看IPC::Run,但我想實際上是:

  • 理解行爲
  • 的這種差異避免更多的依賴如果可能的話

編輯:忘記提及這個東西運行在chroot環境,Squeeze和Precise系統,如果這是相關的(/dev文件系統差異,例如?)。

回答

10

您注意到bugfix

在你所說的5.10.1版本中,open3報告說程序在代碼255下運行並退出。這兩者都不是真的。

在你所說的5.14.2版本中,open3引發了一個異常,因爲它總是被記錄下來並且因爲它總是爲其他一些問題做過。如果需要的話,您可能會發現使用eval BLOCK發起失敗。

+0

酷,從源頭:) :)非常感謝! – cosimo

相關問題