3

我正在执行一个diff命令perl

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: No such file or directory。我想在程序中阅读此消息。如何找到diff命令(或grep我执行的任何命令)的 stderr 消息?

提前感谢帮助。

谢谢, 马修 Liju

4

2 回答 2

12

这在perlfaq8 中得到了回答:如何从外部命令中捕获 STDERR?

如果我想读取进程的 STDOUT 和 STDERR,我使用 Perl 附带的 IPC::Open3。这样,我不必合并这些流,然后再弄清楚输出的哪一部分来自什么。

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

于 2008-11-19T09:58:17.150 回答
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;

- 大卫

于 2008-11-19T12:33:57.600 回答