Почему IPC::Open3 вызывает cmd.exe вместо запрашиваемой программы?
Я запускаю это на Perl 5.16.3 x64 (скомпилировано с VC10) на Windows 7.
Когда я запускаю что-то вроде этого:
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?
Заранее спасибо за любые комментарии.
1 ответ
Чтобы выполнить команду оболочки, вам нужна оболочка.
подобно system
, open3
имеет следующее соглашение о вызовах:
open3(..., ..., ..., $SHELL_COMMAND)
open3(..., ..., ..., $PROG, @ONE_OR_MORE_ARGS)
Следующее не должно вызывать оболочку:
my @command = ('perl', '-e', '$| = 1; for (1..60) { print q{.}; sleep 1 }');
my $pid = open3($in, $out, $err, @command);