2

我在 Windows 7 上的 Perl 5.16.3 x64(用 VC10 编译)上运行它。

当我运行这样的事情时:

use strict;
use warnings;
use IPC::Open3;
use Symbol 'gensym';

my $command = q[perl -e "$| = 1; for (1..60) { print '.'; sleep 1 }"];

my ($in, $out, $err);
$out = gensym;
$err = gensym;

my $pid = open3($in, $out, $err, $command);

我可以在进程列表中看到调用的实际命令IPC::Open3是:

cmd.exe /x/d/c perl -e "$| = 1; for (1..60) { print '.'; sleep 1 }"

当然,这会创建一个带有实际调用的子进程:

perl -e "$| = 1; for (1..60) { print '.'; sleep 1 }"

因此,我得到的是pid与 cmd.exe 对应的,而不是 perl.exe 对应的。

该文档没有提及有关此调用顺序的任何内容或有关 Windows 上不同行为的任何内容。我这里没有 Linux/Unix 机器来测试它,但我敢打赌它不会在那里做类似的事情(如果有人可以测试,如果我错了,请告诉我)。

无论如何,我想知道为什么IPC::Open3要这样做?为什么不直接在该命令中调用 perl?

提前感谢您的任何评论。

4

1 回答 1

3

要执行 shell 命令,您需要一个 shell。

Like system,open3具有以下调用约定:

open3(..., ..., ..., $SHELL_COMMAND)
open3(..., ..., ..., $PROG, @ONE_OR_MORE_ARGS)

以下不应调用 shell:

my @command = ('perl', '-e', '$| = 1; for (1..60) { print q{.}; sleep 1 }');
my $pid = open3($in, $out, $err, @command);
于 2013-04-17T14:28:59.743 回答