将 STDERR 重定向到选择()ed STDOUT

问题描述 投票:0回答:1

如何将 STDERR 重定向到与我

select()
ed STDOUT 相同的进程文件句柄?[1]

  1. 这成功地将 STDERR 重定向到 STDOUT(两行都打印到 STDOUT):

    #!/usr/perl
    
    open( STDOUT, '>&', STDOUT );
    
    print "Output to STDOUT\n";
    print STDERR "Output to STDERR (redirected to STDOUT)\n";
    
  2. 这成功地将 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 相同的寻呼机。

  1. 这不起作用,我得到与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";
    
  2. 这不起作用,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

perl io-redirection
1个回答
0
投票

如何将 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;
© www.soinside.com 2019 - 2024. All rights reserved.