为什么IPC :: Open3调用cmd.exe而不是请求的程序?

时间:2013-04-17 14:09:31

标签: perl ipcopen3

我在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 }"

因此,我得到了与{cmd.exe}对应的pid而不是perl.exe的<{1}}。

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

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

提前感谢任何评论。

1 个答案:

答案 0 :(得分:3)

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

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