使用Perl中的open命令,您可以使用文件句柄。但是我在使用Perl中的open命令返回退出代码时遇到了麻烦。
使用Perl中的system命令,我可以找回正在运行的程序的退出代码。但是我想将STDOUT重定向到某个文件句柄(没有stderr)。
我的stdout将是一个逐行输出的键值对,我想在perl中插入一个mao。这就是为什么我想在perl中仅从我的Java程序重定向我的stdout。这可能吗?
注意:如果我收到错误,错误会打印到stderr。一种可能性是检查是否有任何内容打印到stderr,以便我可以完全使用Perl脚本。
答案 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 = $?;
如果文件句柄来自管道打开,
"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";