繁体   English   中英

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

[英]How can I read stderr when a command execution fails in Perl?

我在perl执行diff命令。

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消息?

提前感谢您的帮助。

谢谢,Mathew Liju

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

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

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

有几个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;

- 大卫

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM