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