Perl STDOUT重定向在child中不起作用



在运行以下Perl程序时,子脚本的输出将打印到终端,而不是进入$v。请让我知道如何修复它。

open (OUTPUT, '>', $v);
select OUTPUT;
$| = 1;
open (SUB, "| sh print_user_input.sh");
print SUB "Hello Worldn";
close(SUB);
close(OUTPUT);
select STDOUT;
print "Output: $vn";

程序的输出为:

Hello World输出:

  1. select不会改变STDOUT
  2. open '>', $buf不创建系统文件句柄。(谁会从中读取数据并将数据放在$buf中?另一个进程不能直接写入$buf,即使perl是一个进程。)

一种解决方案:

use IPC::Run3 qw( run3 );
run3 [ 'sh', 'print_user_input.sh' ],
   "Hello Worldn",
   my $v;

您有两个问题。select并没有改变STDOUT,它只是改变了Perl应该打印到哪个文件句柄的想法;不能在子进程中使用它们。

您希望查看IPC::Open3或类似的模块。

使用IPC::Open2open2函数:

#!/usr/bin/env perl
use strict;
use warnings;
use IPC::Open2;
my $pid = open2( *CHLD_OUT, *CHLD_IN, 'sh print_user_input.sh' );
print CHLD_OUT "Hello Worldn";
close CHLD_OUT;
my $output = do { local $/; <CHLD_OUT> };
print "Output: $output";

最新更新