如何在反引号命令失败时在Perl中获取错误消息

时间:2015-10-28 16:56:15

标签: perl svn

我有一个变量$deployment_tarfile,其中包含一个带有svn位置的tar文件。在我的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

2 个答案:

答案 0 :(得分:5)

$!和朋友报告操作系统级错误。 “未找到文件”,“超出空间”等。另一方面,svn将应用程序级错误报告给STDERR

因此,您可以将svn的{​​{1}}重定向到它的STDERR(通过将STDOUT添加到结尾,您可以轻松地调用shell shell命令)或使用2>&1IPC::Run3之类的内容来获取IPC::Run& STDOUT独立。

...当然,alroc对SVN特定模块的建议可能更适用于特定的案例。

答案 1 :(得分: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";
}