1

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

$ 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形式提供多个管道而不必诉诸命令字符串化可能很有用。

4

1 回答 1

4

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

use IPC::Run 'run';
run ["echo", "Hi"], "|", ["tee", "rso.log"] or die;
于 2013-07-16T09:18:03.643 回答