A substituição do processo >(thing)
será substituída por um nome de arquivo. Este nome de arquivo corresponde a um arquivo que está conectado à entrada padrão do thing
dentro da substituição.
O seguinte seria um exemplo melhor de seu uso:
$ sort -o >(cat -n >/tmp/out) ~/.profile
Isso classificaria o arquivo ~/.profile
e enviaria a saída para cat -n
, que enumeraria as linhas e armazenaria o resultado em /tmp/out
.
Então, para responder à sua pergunta: Você obtém essa saída porque echo
obtém os dois argumentos 123
e /dev/fd/63
. /dev/fd/63
é o arquivo conectado à entrada padrão do processo cat
na substituição do processo.
Modificando seu código de exemplo levemente:
$ echo 101 > >(cat)
Isso produziria apenas 101
na saída padrão (a saída de echo
seria redirecionada para o arquivo que serve como entrada para cat
e cat
produziria o conteúdo desse arquivo na saída padrão ).
Observe também que no cmd1 | cmd2
pipeline, cmd2
pode não estar sendo executado no mesmo shell que cmd1
(dependendo da implementação do shell que você está usando). ksh93
funciona da maneira que você descreve (mesmo shell), enquanto bash
cria um subshell para cmd2
(a menos que sua opção lastpipe
shell esteja definida e o controle de trabalho não esteja ativo).