'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.