2013-04-17 56 views
2

我在Windows 7爲什麼IPC :: Open3調用cmd.exe而不是所請求的程序?

上運行的Perl 5.16.3這64位(含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。

該文檔沒有提及任何有關此調用順序或有關Windows上不同行爲的任何內容。我沒有在這裏測試它的Linux/Unix盒子,但我敢打賭,它不會那樣做(如果有人可以測試,請告訴我,如果我錯了)。

無論如何,我想知道爲什麼IPC::Open3這樣做?爲什麼不直接在該命令中調用perl?

在此先感謝您的任何意見。

回答

3

要執行shell命令,您需要一個shell。

systemopen3具有以下調用約定:

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

偉大的答案。我從來沒有想過這兩個公約之間有實際的區別。謝謝! :-) –

+0

同意@Francisco Zarabozo評論,很好的回答! – arkhamvm

相關問題