为什么在这种情况下进程替换比管道更快?

为什么在这种情况下进程替换比管道更快?

我想知道为什么

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 个文件,则:

  • 第二条命令需要近 100 秒来处理
  • 第一个命令几乎立即被处理。

答案1

使用管道时,shell 会同时运行管道中的每个命令,并等待所有命令完成后再执行下一个命令。这在文档:

如果管道不是异步执行的(请参阅列表),shell 等待管道中的所有命令完成。

当上面提到异步执行管道时,它指的是在后台运行整个管道&

当您使用进程替换时,shell 不会等待它完成。这文档只是说:

过程列表异步运行,其输入或输出显示为文件名。

相关内容