perl open:如何将标准错误转发到标准输出? [复制]

Posted

技术标签:

【中文标题】perl open:如何将标准错误转发到标准输出? [复制]【英文标题】:perl open: how to forward stderr to stdout? [duplicate] 【发布时间】:2012-12-06 08:28:32 【问题描述】:

可能重复: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】:

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

【讨论】:

以上是关于perl open:如何将标准错误转发到标准输出? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Django 标准输出转发到 Elastic Beanstalk 日志?

Perl基础命令---文件句柄基础

如何将命令发送到在 perl 的非标准端口上运行的 telnet

Perl IPC::Run 附加输出并解析标准错误,同时将其保存在一批文件中

将标准输出字节从 Process 转发到 WebSocket 或读取当前 InputStream 长度

如何检测标准输出是不是连接到 Perl 中的 tty?