首页 文章

perl open:如何将stderr转发给stdout? [重复]

提问于
浏览
1

可能重复:如何在Perl中同时捕获stderr,stdout和退出代码?在将STDOUT传送到文件时捕获STDERR的输出

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

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

不幸的是,我只会阅读标准输出 . 但我也想阅读stderr .

Stderr重定向导致以下错误:

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

我怎样才能将stderr转发给stdout?

1 回答

  • 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);
    

相关问题