如何将 STDERR 重定向到与我
select()
ed STDOUT 相同的进程文件句柄?[1]
这成功地将 STDERR 重定向到 STDOUT(两行都打印到 STDOUT):
#!/usr/perl
open( STDOUT, '>&', STDOUT );
print "Output to STDOUT\n";
print STDERR "Output to STDERR (redirected to STDOUT)\n";
这成功地将 STDOUT 通过管道传输到寻呼机(在本例中为
less
),而 STDERR 仍然直接写入终端。 (您首先会看到 STDOUT,已分页,退出分页器后,您会看到 STDERR 行。)
#!/usr/perl
open( my $pager, '|-', 'less' );
select( $pager );
print "Output to STDOUT (redirected to 'less')\n";
print STDERR "Output to STDERR\n";
我想将两者结合起来——将 STDERR 通过管道传输到与 STDOUT 相同的寻呼机。
这不起作用,我得到与2)中相同的结果。 (有趣的是,如果我将脚本输出通过管道传输到
less
again——如 ./testme.pl | less
那样——输出 are 组合在 STDOUT 上。但是 STDERR not 通过脚本打开的寻呼机进程本身。)
#!/usr/perl
open( my $pager, '|-', 'less' );
select( $pager );
open( STDERR, '>&', STDOUT );
print "Output to STDOUT\n";
print STDERR "Output to STDERR (gets redirected to STDOUT but not to 'less')\n";
这不起作用,STDERR 输出完全消失:
#!/usr/perl
open( my $pager, '|-', 'less' );
select( $pager );
open( STDOUT, '>', $pager );
print "Output to STDOUT\n";
print STDERR "Output to STDERR (but does not show up anywhere)\n";
如何将 STDERR 重定向到与我
select()
ed STDOUT 相同的进程文件句柄?[1]
[1]:在实际程序中,我正在检查 STDOUT / STDERR 是否已被调用者重定向。为了简洁起见,我在示例中省略了这些检查。
如果
select()
是这里的问题,我会很高兴实现相同的效果 - STDOUT 和 STDERR 通过管道传输到同一个寻呼机进程 - 没有 select()
。
目标平台包括 Windows 版 Git Bash,这严重限制了其他模块的可用性。理想的答案无需
use
ing即可工作,例如IPC::Open
。
如何将 STDERR 重定向到与我选择()编辑 STDOUT 的进程文件句柄相同的进程文件句柄?
以下对我有用:
use v5.38;
my $pid = open( my $pager, '|-', 'less' ) or die "Can't start less: $!";
{
local *STDOUT = $pager;
local *STDERR = $pager;
#select( $pager );
print "Output to STDOUT\n";
print STDERR "Output to STDERR\n";
}
close $pager;