对于我来说,在Perl中通常可以获得包含STDOUT和STDERR的单个字符串。我是这样做的:
my $stdout_and_stderr = `$cmd 2>&1`;
但是现在我需要它在2个单独的字符串中 - 一个用于STDOUT,一个用于STDERR。
如何在Perl中完成?
答案 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`;
如果您需要分别捕获它们,请使用此主题中的其他答案之一。他们非常好