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 メッセージを見つけるにはどうすればよいですか?

事前に助けに感謝します。

ありがとう、マシュー・リジュ

4

2 に答える 2

12

これはperlfaq8 で回答されています: How can I capture STDERR from an external command?

プロセスの STDOUT と STDERR を読みたい場合は、Perl に付属の IPC::Open3 を使用します。そうすれば、これらのストリームをマージして、後で出力のどの部分が何から来たのかを把握する必要がなくなります。

可能な限り一時ファイルを避けようとします(そうではありません2>file.txt)。STDERR を直接読み取ることができる場合、これは作業とコードが多すぎます。

于 2008-11-19T09:58:17.150 に答える
4

これを簡単にし、STDOUT と STDERR を分けておくことができるいくつかの CPAN モジュールがあります。たとえば、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 に答える