IPC::Open2 根据文档示例输出到已打开的文件句柄
IPC::Open2 output to already open file handle as per doc example
perldoc IPC::Open2
中记录的示例(从父 STDIN 读取并写入已打开的句柄)是我试图实现的简化版本。即,父进程将前导码写入输出文件,然后子进程将其输出直接写入同一文件。
我制作了一个简单的子脚本,它读取输入行并打印到 STDERR
和 STDOUT
。 STDOUT
是来自父级的 'already open handle'。
#!/usr/bin/env perl
##parent.pl
use IPC::Open2;
# read from parent STDIN and write to already open handle
open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2($file, "<&STDIN", "./child.pl");
# reap zombie and retrieve exit status
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
#!/usr/bin/env perl
##child.pl
while(<STDIN>){
print STDOUT "STDOUT: ",$_;
print STDERR "STDERR: ", $_;
}
print STDERR "END OF CHILD\n";
parent.pl
的一个例子运行:
Hello
^D
STDERR: Hello
STDERR: END OF CHILD
但是,我在输出文件中没有看到预期的“STDOUT: Hello”'outfile.txt'
我是否遗漏了一些额外的设置来让这个示例工作?
open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2($file, "<&STDIN", "./child.pl");
这将创建一个新管道,并用指向管道读取端的句柄覆盖 $file
变量,关闭进程中的旧文件句柄;-)
为了将现有文件句柄传递给 open2
或 open3
,您想使用 >&FILEHANDLE
格式,但我想不出任何方法来当 FILEHANDLE
是局部变量时执行此操作,因为您的 my $file
.
但是未记录的 >&NUM
或 >&=NUM
形式(其中 NUM
是一个文件描述符编号)只是工作:
open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2('>&'.fileno($file), '<&STDIN', './child.pl');
示例:
$ perl -MIPC::Open2 -e '
open my $f, ">foo";
open2(">&".fileno($f), "<&STDIN", "echo bar")
'; cat foo
bar
perldoc IPC::Open2
中记录的示例(从父 STDIN 读取并写入已打开的句柄)是我试图实现的简化版本。即,父进程将前导码写入输出文件,然后子进程将其输出直接写入同一文件。
我制作了一个简单的子脚本,它读取输入行并打印到 STDERR
和 STDOUT
。 STDOUT
是来自父级的 'already open handle'。
#!/usr/bin/env perl
##parent.pl
use IPC::Open2;
# read from parent STDIN and write to already open handle
open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2($file, "<&STDIN", "./child.pl");
# reap zombie and retrieve exit status
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
#!/usr/bin/env perl
##child.pl
while(<STDIN>){
print STDOUT "STDOUT: ",$_;
print STDERR "STDERR: ", $_;
}
print STDERR "END OF CHILD\n";
parent.pl
的一个例子运行:
Hello
^D
STDERR: Hello
STDERR: END OF CHILD
但是,我在输出文件中没有看到预期的“STDOUT: Hello”'outfile.txt'
我是否遗漏了一些额外的设置来让这个示例工作?
open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2($file, "<&STDIN", "./child.pl");
这将创建一个新管道,并用指向管道读取端的句柄覆盖 $file
变量,关闭进程中的旧文件句柄;-)
为了将现有文件句柄传递给 open2
或 open3
,您想使用 >&FILEHANDLE
格式,但我想不出任何方法来当 FILEHANDLE
是局部变量时执行此操作,因为您的 my $file
.
但是未记录的 >&NUM
或 >&=NUM
形式(其中 NUM
是一个文件描述符编号)只是工作:
open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2('>&'.fileno($file), '<&STDIN', './child.pl');
示例:
$ perl -MIPC::Open2 -e '
open my $f, ">foo";
open2(">&".fileno($f), "<&STDIN", "echo bar")
'; cat foo
bar