考虑以下涉及管道的命令:
$ echo Hi | tee test.log
Hi
基于perldoc exec
:
如果 中有多个参数
LIST
,或者如果LIST
是具有多个值的数组,则execvp(3)
使用 中的参数调用LIST
。 如果只有一个标量参数或其中包含一个元素的数组,则检查参数是否有 shell 元字符,如果有,则将整个参数传递给系统的命令 shell 进行解析(这是/bin/sh -c
在 Unix 平台上,但在其他平台上有所不同)。如果参数中没有shell元字符,则将其拆分为单词并直接传递给execvp
,这样效率更高。
基于此,以下命令不会 tee 输出:
$ 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
形式提供多个管道而不必诉诸命令字符串化可能很有用。