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

发布于 2024-08-30 18:28:12 字数 487 浏览 7 评论 0原文

通过 Perl 中的 open 命令,您可以使用文件句柄。但是,我无法使用 Perl 中的 open 命令取回退出代码。

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

我的标准输出将是键值对的逐行输出,我想将其插入到 perl 中的 mao 中。这就是为什么我只想从 Perl 中的 Java 程序重定向我的标准输出。这可能吗?

注意:如果出现错误,错误将打印到 stderr。一种可能性是检查是否有任何内容打印到 stderr,以便我可以完全执行 Perl 脚本。

With the open command in Perl, you can use a filehandle. However I have trouble getting back the exit code with the open command in Perl.

With the system command in Perl, I can get back the exit code of the program I'm running. However I want to just redirect the STDOUT to some filehandle (no stderr).

My stdout is going to be a line-by-line output of key-value pairs that I want to insert into a mao in perl. That is why I want to redirect only my stdout from my Java program in perl. Is that possible?

Note: If I get errors, the errors get printed to stderr. One possibility is to check if anything gets printed to stderr so that I can quite the Perl script.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

秋风の叶未落 2024-09-06 18:28:12

按照规范,如果您试图获取分叉进程的文本输出,我的理解是这就是反引号的用途。如果您还需要退出状态,可以随后使用 $? 特殊变量进行检查,例如:

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

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

Canonically, if you're trying to get at the text output of a forked process, my understanding is that's what the backticks are for. If you need the exit status as well, you can check it with the $? special variable afterward, e.g.:

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

Output to STDERR from the command in backticks will not be captured, but will instead be written directly to STDERR in the Perl program it's called from.

橘香 2024-09-06 18:28:12

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

You may want to check out IPC::System::Simple -- it gives you many options for executing external commands, capturing its output and return value, and optionally dying if a bad result is returned.

天暗了我发光 2024-09-06 18:28:12

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

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";

This is one of the ways to do it.

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";
半暖夏伤 2024-09-06 18:28:12

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

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}”

Use open in -| mode. When you close the filehandle, the exit status will be in $?.

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

From perldoc -f close

If the file handle came from a piped open, "close" will
additionally return false if one of the other system calls
involved fails, or if the program exits with non-zero status.
(If the only problem was that the program exited non-zero, $!
will be set to 0.) Closing a pipe also waits for the process
executing on the pipe to complete, in case you want to look at
the output of the pipe afterwards, and implicitly puts the exit
status value of that command into $? and
"${^CHILD_ERROR_NATIVE}".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文