2008-11-19 48 views
3

我在perl执行diff命令。如何在Perl中执行命令失败时读取stderr?

my @lines = `/usr/local/bin/diff -udr \"$expected_file\" \"$gen_file\"`; 

if ($? != 0) 
{ 
    print ERRFILE "Diff between $expected_file and $gen_file failed\n"; 
    return $diff_err; 
} 

这里diff可能会因为某种原因失败。例如:stderr显示/usr/local/bin/diff:test.txt:没有这样的文件或目录。我想在程序中阅读这条消息。我如何找到diff命令(或grep或我执行的任何命令)的stderr消息?

提前感谢帮助。

感谢, 马修礼居

回答

12

这在perlfaq8: How can I capture STDERR from an external command?

回答如果我想读的过程中STDOUT和STDERR,我使用IPC :: Open3,附带的Perl。这样,我就不必合并这些流,然后找出输出的哪一部分来自什么。

我会尽量避免临时文件(所以没有2>file.txt)。当我可以直接阅读STDERR时,这只是太多的工作和代码。

4

有几个CPAN模块可以让您轻松实现STDOUT和STDERR。例如,IO::CaptureOutput会让你做这样的(虽然你将需要拆分自己行):

use IO::CaptureOutput 'qxx'; 


my ($stdout, $stderr, $ok) = 
    qxx(qq(/usr/local/bin/diff -udr "$expected_file" "$gen_file")); 

if (! $ok) 
{ 
    print ERRFILE "Diff between $expected_file and $gen_file failed\n"; 
    return $stderr; 
} 

my @lines = split /\n/, $stdout; 

大卫 -