2015-10-28 26 views
2

我有一個變量$deployment_tarfile,它包含一個帶有svn位置的tar文件。在我的Perl腳本反引號命令中,我使用如何在反向命令失敗時在Perl中獲取錯誤消息

$depsvn = `svn ls $deployment_tarfile` 

檢查文件是否存在於svn中。如果失敗了,我們如何記錄錯誤信息?

目前,如果命令失敗,它只會顯示在shell中。我想專門打印它。我怎樣才能做到這一點?我試過$!,但它不顯示。

$depsvn = `svn ls $deployment_tarfile`; 
if ($? != 0) { 
    print "$!"; # It displays blank 
} 

我自己也嘗試$OS_ERROR$ERRNO而不是$!,但沒有奏效。

如何在svn命令失敗時在Perl中打印錯誤消息?

更新:我使用Perl版本5.8.8

+4

您是否需要Subversion命令的輸出?如果沒有,那麼你應該使用'我的$統計=系統('svn','ls',$ deployment_tarfile)'並檢查退出狀態。如果您需要輸出以及退出狀態,那麼您應該查看[IPC :: Open2](http://metacpan.org/module/IPC::Open2) 甚至[IPC :: Open3] (http://metacpan.org/module/IPC::Open3) 如果您還需要查看STDERR – Borodin

+2

爲什麼要調用命令行客戶端而不是使用['SVN :: Client'](http:/ /search.cpan.org/~mlanier/Alien-SVN-1.6.12.0/src/subversion/subversion/bindings/swig/perl/native/Client.pm)? – alroc

+0

是的,我需要Subversion命令的輸出。我將嘗試IPC :: Open2 IPC :: Open3.Thanks獲取信息。 – Nitu

回答

5

$!和朋友報告OS級別的錯誤。 「未找到文件」,「空間不足」等。另一方面,svn正在向STDERR報告應用程序級別錯誤。

因此,你可以重定向svnSTDERR到它的STDOUT(足夠容易做,因爲要調用的外殼加上2>&1到shell命令的結束),或使用類似IPC::Run3IPC::Run,得到STDOUT & STDERR

......當然alroc推薦的SVN專用模塊可能更適用於這個特定的的情況。

+0

我沒有嘗試$ depsvn ='svn ls $ deployment_tarfile 2> $ 1';它也起作用。但在Perl腳本中是否有任何特殊變量可以直接給出錯誤? – Nitu

+4

@Nitu,你想抓住'svn' *打印到句柄*。如果你想在一個變量中使用,你需要提供'svn'和一個管道句柄,並且從管道的另一端讀取它打印到管道的內容,並將其存儲在一個變量中。這就是IPC :: Run3的'run3'爲你做的。 – ikegami

+0

謝謝ikegami的解釋。 – Nitu

5

對於更高級的程序執行,請使用IPC::Run3

use strict; 
use warnings; 
use v5.10; 

use IPC::Run3; 

my $file = shift; 

my($out, $err); 
run3(['svn', 'ls', $file], undef, \$out, \$err); 
if($?) { 
    say "svn ls failed: $err"; 
} 
else { 
    say "svn ls succeeded: $out"; 
} 

如果你想STDOUT和STDERR在同一個地方,你可以在兩個地方提供相同的變量。

my $out; 
run3(['svn', 'ls', $file], undef, \$out, \$out); 
if($?) { 
    say "svn ls failed: $out"; 
} 
else { 
    say "svn ls succeeded: $out"; 
} 
+0

感謝您提供有價值的信息。但目前我正在使用不支持IPC :: Run3和IPC :: Run的5.8.8版python。 – Nitu

+0

@Nitu我相信你的意思是Perl。 [IPC :: Run和IPC :: Run3應該可以使用5.8.8](http://matrix.cpantesters.org/?dist=IPC-Run3+0.048)。但是,5.8.8歲已經九歲了,我強烈建議你升級。使用[perlbrew](http://perlbrew.pl/)將使這個過程更容易。 – Schwern

+0

是Schwern,我的意思是Perl。感謝您指出它。我嘗試使用IPC :: Run,但它表示不支持。 – Nitu

相關問題