2013-07-16 29 views
1

考慮以下命令涉及的管:是否可以讓系統(@args)保存shell元字符?

$ echo Hi | tee test.log 
Hi 

基於perldoc exec

如果有多於一個參數在LIST,或者如果LIST是一個數組 具有多於一個值,在LIST中調用execvp(3)如果存在,並且如果存在 任何,整個參數被傳遞到系統的命令外殼爲 解析它,該參數被用於shell字符檢查只有一個標量參數或在 與一個元素的數組(此在Unix平臺上是/bin/sh -c,但在其他 平臺上有所不同)。如果參數中沒有shell元字符,它將被拆分爲單詞並直接傳遞給execvp,這更有效率,即 。


在此基礎上,下面的命令不發球輸出:

$ perl -Mstrict -wle 'my @args = ("Hi", "| tee test.log"); 
         system("echo", @args);' 
Hi | tee test.log 

而這一個作用:

$ perl -Mstrict -wle 'my @args = ("Hi", "| tee test.log"); 
         system(join " " => "echo", @args);' 
Hi 

的問題是沒有這麼多關於如何tee因爲它是關於如何在系統命令中進行管道操作的(否則File::Tee就足夠了)。

我覺得它可以提供多個管道在@args表單而不必求助於命令字符串化可能是有用的。

+1

不,你不能用'系統做()'這樣。當你用多個參數調用它時,不涉及shell。 – Barmar

+0

@Barmar:如果'system'不可行,是否有通過CPAN模塊的替代接口? – Zaid

回答

4

如果您需要重定向混合的system()的列表形式,管道等,然後使用CPAN模塊IPC::Run

use IPC::Run 'run'; 
run ["echo", "Hi"], "|", ["tee", "rso.log"] or die; 
相關問題