この場合、パイプよりもプロセスの交換が速いのはなぜですか? [コピー]

この場合、パイプよりもプロセスの交換が速いのはなぜですか? [コピー]

理由を知りたい

ls -1 | 
while read file; do 
     echo $file; tail -n 100 $file > >(sleep 1 && cat > $file)
done  

比較する

ls -1 | 
while read file; do 
    echo $file; tail -n 100 $file | (sleep 1 && cat > $file)
done   

ディレクトリに100個のファイルがある場合:

  • 2番目のコマンドを処理するのに約100秒かかります。
  • 最初のコマンドはほぼすぐに処理されます。

答え1

パイプを使用すると、シェルはパイプ内の各コマンドを同時に実行し、次のコマンドを実行する前にすべてのコマンドが完了するのを待ちます。これは文書:

パイプラインが非同期で実行されない(参照)リスト)、シェルはパイプラインのすべてのコマンドが完了するのを待ちます。

上記でパイプラインの非同期実行を参照すると、これはパイプライン全体をバックグラウンドで実行することを意味します&

プロセス置換を使用すると、シェルはプロセスが完了するのを待ちません。これ文書ただ言う:

プロセスリスト入力または出力はファイル名で表示され、非同期で実行されます。

関連情報