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
表單而不必求助於命令字符串化可能是有用的。
不,你不能用'系統做()'這樣。當你用多個參數調用它時,不涉及shell。 – Barmar
@Barmar:如果'system'不可行,是否有通過CPAN模塊的替代接口? – Zaid