Perl:获取系统调用的STDERR,与STDOUT分开

时间:2015-02-10 08:28:58

标签: perl

对于我来说,在Perl中通常可以获得包含STDOUT和STDERR的单个字符串。我是这样做的:

my $stdout_and_stderr = `$cmd 2>&1`;

但是现在我需要它在2个单独的字符串中 - 一个用于STDOUT,一个用于STDERR。

如何在Perl中完成?

3 个答案:

答案 0 :(得分:2)

use IPC::Run3 qw( run3 );
run3 [ 'sh', '-c', $cmd ], undef, my $stdout, my $stderr;

答案 1 :(得分:0)

这是一个例子。

#!/usr/bin/perl
use warnings;
use strict;
use IPC::Open3;

my $cmd = 'ls -la';

my $pid = open3(\*WRITER, \*READER, \*ERROR, $cmd);
#if \*ERROR is 0, stderr goes to stdout

while( my $output = <READER> )
{
    print "output->$output";
}

while( my $errout = <ERROR> )
{
    print "err->$errout";
}

waitpid( $pid, 0 ) or die "$!\n";
my $retval =  $?;
print "retval-> $retval\n";

答案 2 :(得分:0)

实际上我找到了一种只捕获STDERR的简单方法。抓住STDERR并扔掉STDOUT:

$output = `cmd 2>&1 1>/dev/null`;

你也可以这样做 - 扔掉STDERR,这样它甚至不会打印到shell上:

$output = `cmd 2>/dev/null`; 

如果您需要分别捕获它们,请使用此主题中的其他答案之一。他们非常好

相关问题