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

Perl: Getting STDERR of system call, separately from STDOUT

我通常在 Perl 中获得一个包含 STDOUT 和 STDERR 的字符串就足够了。我是这样做的:

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

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

如何在 Perl 中完成?

这是一个例子。

#!/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";
use IPC::Run3 qw( run3 );
run3 [ 'sh', '-c', $cmd ], undef, my $stdout, my $stderr;

实际上我找到了一种更简单的方法来只捕获 STDERR。捕获 STDERR 并丢弃 STDOUT:

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

你也可以反其道而行之 - 扔掉 STDERR,这样它甚至不会打印到 shell:

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

如果您需要分别捕获它们,请使用此线程中的其他答案之一。他们很好