我有一个变量$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
答案 0 :(得分:5)
$!
和朋友报告操作系统级错误。 “未找到文件”,“超出空间”等。另一方面,svn
将应用程序级错误报告给STDERR
。
因此,您可以将svn
的{{1}}重定向到它的STDERR
(通过将STDOUT
添加到结尾,您可以轻松地调用shell shell命令)或使用2>&1
或IPC::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";
}