'foo' é substituição de comando , não substituição de processo. $(foo) também é a substituição de comando e é a forma preferida, já que é mais fácil usar a substituição de comando aninhada: $(foo1 $(foo2 $(foo3 ...))) .
Com a substituição do comando, 'foo' / $(foo) , a saída de foo é usada como palavras na linha de comando. Então, for in $(echo a b c) se torna como se você tivesse usado for i in a b c . O comando na substituição do comando é executado primeiro, sua saída é obtida e, em seguida, a saída é usada para criar a próxima linha de comando, que é então executada, e assim por diante. Divisão de campo, expansão de caractere curinga, etc. ocorrem, portanto, a cotação é uma consideração importante na substituição de comando.
Com substituição de processos , <(foo) / >(foo) , o stdin / stdout do processo é fornecido como um arquivo, então cat <(foo) se torna como se você tivesse usado foo > /some/file e cat /some/file e tee >(foo) se tornasse como se você tivesse feito tee /some/file e foo < /some/file . Os comandos são executados simultaneamente. Como a saída não é vista pelo shell, a divisão de campo e a expansão de curingas não são uma preocupação.