是否有可能让系统(@args)保留shell元字符?

时间:2013-07-16 08:34:38

标签: perl system

考虑以下涉及管道的命令:

$ echo Hi | tee test.log
Hi

基于perldoc exec

  

如果LIST中有多个参数,或者LIST是一个数组   如果有多个值,请使用execvp(3)中的参数调用LIST。   如果只有一个标量参数或包含一个元素的数组   它,参数被检查shell元字符,如果有的话   any,整个参数传递给系统的命令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 个答案:

答案 0 :(得分:4)

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

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