1

パイプを含む次のコマンドを検討してください。

$ echo Hi | tee test.log
Hi

に基づくperldoc exec:

に複数の引数があるLIST場合、またはLISTが複数の値を持つ配列である場合、execvp(3)の引数を使用して を呼び出しますLISTスカラー引数が 1 つしかない場合、または 1 つの要素を含む配列が存在する場合、シェルのメタ文字について引数がチェックされ、存在する場合は、解析のために引数全体がシステムのコマンド シェルに渡されます(これは/bin/sh -cUnix プラットフォームの場合ですが、他のプラットフォームでは異なります)。引数にシェルのメタ文字がない場合、それは単語に分割され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コマンド文字列化に頼らなくても、複数のパイプを形式で提供できると便利だと思います。

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 に答える