我在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?
提前感谢任何评论。
答案 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);