2013-04-17 4 views
2

나는 이런 식으로 뭔가 실행하면 나는 윈도우 7IPC :: Open3이 요청한 프로그램 대신 cmd.exe를 호출하는 이유는 무엇입니까?

에 펄에 (VC10로 컴파일) 5.16.3 64 이것을 실행 해요 :

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에서의 다른 동작과 관련된 것에 대해서는 언급되어 있지 않습니다. 나는 그것을 테스트 할 리눅스/유닉스 박스를 가지고 있지 않지만, 거기에 그런 것을하지 않을 것이라고 확신한다. (만약 누군가가 테스트 할 수 있다면 틀렸다면 알려줘).

어쨌든, 나는 왜 이것을하고 있는지 궁금합니다. IPC::Open3? 그 명령에서 펄을 직접 호출하지 않는 이유는 무엇입니까?

미리 의견을 보내 주셔서 감사합니다.

답변

3

셸 명령을 실행하려면 셸이 필요합니다. system처럼

, open3는 다음의 호출 규칙이 있습니다

my @command = ('perl', '-e', '$| = 1; for (1..60) { print q{.}; sleep 1 }'); 
my $pid = open3($in, $out, $err, @command); 
+0

대 답 :

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

다음은 쉘을 호출하지 않아야 다음과 같습니다. 나는이 두 관습 사이에 실제적인 차이가 있다고 생각한 적이 없었다. 감사! :-) –

+0

@Francisco Zarabozo comment, 훌륭한 대답에 동의합니다! – arkhamvm