系统命令输出泄漏 - perl

时间:2014-06-25 20:03:55

标签: perl command system output

刚开始在这里使用Perl。我之前已成功使用反引号来捕获Perl中的系统命令输出,例如:

my @sysOut = `cleartool checkout -nc \"$file\"`; # works fine!

但是我遇到了一些麻烦,即使在看了一段时间后我也找不到解决这个问题的方法。我正在尝试使用cleartool编写一个Perl脚本来检查已检出文件(@allfiles)的列表,除非它们与它们的前任相同,然后取消签出它们。

我的方式(...失败!)检测它们是否相同是从检入尝试中获取输出,看它是否与/error.*identical/i匹配,然后如果是,则取消选中文件。但是,出于某种原因,输出似乎绕过了我传递给它的数组 请参阅生成此问题的代码:

foreach my $file (@allfiles){ 
    chomp( my @checkInErr = `cleartool checkin -nc \"$file\"`);
    foreach my $err (@checkInErr) { # if no error, checkin done
        if ($err =~ m/error.*identical/i) {  # if there is error:
            print $err; 
            print "No change detected: unchecking out.\n"; # uncheckout same version
            system "cleartool uncheckout -rm -cact \"$file\""; 
        }
    } 
}

这是我的命令行输出(好像我刚刚使用了system()调用):

cleartool: Error: Unable to check in "a5TI.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
cleartool: Error: Unable to check in "a6cm.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
cleartool: Error: Unable to check in "a6FT.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
cleartool: Error: Unable to check in "a6pm.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
cleartool: Error: Unable to check in "a6TI.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.

解决方案:在抓取输出时检查std错误流(回想起来,这是有意义的,因为我试图解析错误消息...哦,好吧)

my @checkInErr = `cleartool checkin -nc \"$file\" 2>&1`;

1 个答案:

答案 0 :(得分:1)

可能是标准输出(标准输出)上没有出现来自cleartool的错误输出。运气好的话,它出现在标准错误(stderr)上。如果是这样,这应该有效:

system "cleartool uncheckout -rm -cact \"$file\" 2>&1";