Por que a substituição do processo é mais rápida que o pipe neste caso? [duplicado]

1

Eu estou querendo saber por que

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

é mais rápido que

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

Se houver 100 arquivos em um diretório, então:

  • o segundo comando leva quase 100 segundos para processar
  • o primeiro comando é processado quase imediatamente.
por haccks 29.03.2018 / 15:38

1 resposta

2

Quando você usa um pipeline, o shell executa cada comando no pipeline simultaneamente e espera que todos eles sejam concluídos antes de ir para o próximo comando. Isso é explicado na documentação :

If the pipeline is not executed asynchronously (see Lists), the shell waits for all commands in the pipeline to complete.

Quando o acima se refere a executar o pipeline de forma assíncrona, está falando sobre a execução de todo o pipeline em segundo plano com & .

Quando você usa a substituição de processo, o shell não aguarda a conclusão. A documentação diz simplesmente:

The process list is run asynchronously, and its input or output appears as a filename.

    
por 30.03.2018 / 02:33