我在this question询问了IPC :: Open3。但是,我仍然遇到问题。
此代码挂起,而不是等到stdin上显示EOF。它也无法向stderr写任何东西。
这不是重复,因为该问题询问捕获输出,而这个问题询问输入。
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use v5.10;
use IPC::Open3;
use Symbol 'gensym';
my $output;
# pipe my $input, $output or die $!;
my $pid = open3(\*STDIN, $output, \*STDERR, 'sh',
'-c', 'echo 1 >&2; cat /usr/include/unistd.h -') or die $!;
while (<$output>) {
say $output;
}
waitpid $pid, 0;
答案 0 :(得分:1)
您的程序遇到以下问题:
\*STDIN
(打开STDIN
作为与孩子STDIN
绑定的管道)应为<&STDIN
(使用父母STDIN
作为孩子的STDIN
)。\*STDERR
(打开STDERR
作为与孩子STDERR
绑定的管道)应为>&STDERR
(使用父母STDERR
作为孩子的STDERR
)。say $output;
应为say $_;
或say;
。say
,但您正在打印的值已经换行终止。请先使用chomp
,或切换为使用print
。open3
不是系统调用,因此它不会设置$!
。open3
出错时不会返回false;它抛出异常。请注意,如果您将单个标量作为命令传递,则会将其传递给sh -c
。
#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
use IPC::Open3 qw( open3 );
my $pid = open3('<&STDIN', my $output, '>&STDERR',
'echo 1 >&2; cat /usr/include/unistd.h -');
while (<$output>) {
chomp;
say "<$_>";
}
waitpid($pid, 0);