perl open:如何将stderr转发给stdout?

时间:2012-12-06 08:28:32

标签: perl stdout stderr

  

可能重复:
  How do you capture stderr, stdout, and the exit code all at once, in Perl?
  Capturing the output of STDERR while piping STDOUT to a file

我正在使用以下代码来执行一个过程:

open( my $proch, "-|", $command, @arguments );

不幸的是,我只会阅读 stdout 。但我也想阅读 stderr

Stderr重定向会导致以下错误:

open( my $proch, "2>&1 -|", $command, @arguments );
>>> Unknown open() mode '2>&1 -|' at file.pl line 289

如何将 stderr 转发到 stdout

1 个答案:

答案 0 :(得分:4)

2>&1是shell命令的一部分,但您没有执行shell。

open( my $proch, "-|", 'sh', '-c', '"$@" 2>&1', '--', $command, @arguments );

如果您想避免产生额外的过程,可以使用以下内容:

use IPC::Open3 qw( open3 );

open local *CHILD_STDIN, '<', '/dev/null') or die $!;
my $pid = open3(
   '<&CHILD_STDIN',
   \local *PROCH,
   undef, # 2>&1
   $command, @arguments
);

while (<PROCH>) { ... }

waitpid($pid, 0);