考虑以下涉及管道的命令:
$ 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
形式提供多个管道而不必求助于命令字符串化会很有用。
答案 0 :(得分:4)
如果您需要将system()
的列表形式与重定向,管道等混合使用,请使用CPAN模块IPC::Run
:
use IPC::Run 'run';
run ["echo", "Hi"], "|", ["tee", "rso.log"] or die;