如何将Perl系统()的输出重定向到文件句柄?

时间:2010-04-27 05:52:05

标签: perl fork io-redirection

使用Perl中的open命令,您可以使用文件句柄。但是我在使用Perl中的open命令返回退出代码时遇到了麻烦。

使用Perl中的system命令,我可以找回正在运行的程序的退出代码。但是我想将STDOUT重定向到某个文件句柄(没有stderr)。

我的stdout将是一个逐行输出的键值对,我想在perl中插入一个mao。这就是为什么我想在perl中仅从我的Java程序重定向我的stdout。这可能吗?

注意:如果我收到错误,错误会打印到stderr。一种可能性是检查是否有任何内容打印到stderr,以便我可以完全使用Perl脚本。

4 个答案:

答案 0 :(得分:3)

您可能想要查看IPC::System::Simple - 它为您提供了许多选项来执行外部命令,捕获其输出和返回值,以及如果返回错误结果,可选择死亡。

答案 1 :(得分:3)

通常情况下,如果你试图获得分叉进程的文本输出,我的理解就是反引号的用途。如果您还需要退出状态,则可以在之后使用$?特殊变量进行检查,例如:

open my $fh, '>', "output.txt" or die $!;
print {$fh} `echo "Hello!"`;
print "Return code: $?\n";

不会捕获从反引号中的命令输出到STDERR,而是直接写入调用它的Perl程序中的STDERR。

答案 2 :(得分:1)

open模式下使用-|。当您close文件句柄时,退出状态将位于$?

open my $fh, '-|', "$command";  # older version:  open my $fh, "$command |";
my @command_output = <$fh>;
close $fh;
my $command_status = $?;

来自perldoc -f close

  

如果文件句柄来自管道打开,"close"将会   如果其他系统调用之一,则另外返回false   涉及失败,或者程序以非零状态退出。   (如果唯一的问题是程序退出非零,$!   将被设置为0.)关闭管道也等待该过程   在管道上执行完成,以防你想看   之后管道的输出,并隐式地放置出口   该命令的状态值为$?和   "${^CHILD_ERROR_NATIVE}"

答案 3 :(得分:0)

这是实现目标的方法之一。

open my $fh, '>', $file;
defined(my $pid = fork) or die "fork: $!";
if (!$pid) {
    open STDOUT, '>&', $fh;
    exec($command, @args);
}
waitpid $pid, 0;
print $? == 0 ? "ok\n" : "nok\n";