Uma boa maneira de aumentar a diferença entre eles é fazer uma pequena experiência na linha de comando. Apesar da semelhança visual no uso do caractere <
, ele faz algo muito diferente de um redirecionamento ou pipe.
Vamos usar o comando date
para testes.
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
Este é um exemplo inútil, mas mostra que cat
aceitou a saída de date
em STDIN e cuspiu-a de volta. Os mesmos resultados podem ser obtidos por substituição de processo:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
No entanto, o que aconteceu nos bastidores foi diferente. Em vez de receber um fluxo STDIN, cat
recebeu o nome de um arquivo que precisava abrir e ler. Você pode ver esta etapa usando echo
em vez de cat
.
$ echo <(date)
/proc/self/fd/11
Quando cat recebeu o nome do arquivo, ele leu o conteúdo do arquivo para nós. Por outro lado, o echo apenas nos mostrou o nome do arquivo que foi passado. Essa diferença se torna mais óbvia se você adicionar mais substituições:
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
É possível combinar a substituição de processos (que gera um arquivo) e o redirecionamento de entrada (que conecta um arquivo a STDIN):
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Parece praticamente o mesmo, mas desta vez o gato foi passado no fluxo STDIN em vez de um nome de arquivo. Você pode ver isso experimentando com echo:
$ echo < <(date)
<blank>
Como echo não lê STDIN e nenhum argumento foi passado, não conseguimos nada.
Pipes e redirecionamentos de entrada empurram o conteúdo para o fluxo STDIN. A substituição de processos executa os comandos, salva sua saída em um arquivo temporário especial e, em seguida, passa esse nome de arquivo no lugar do comando. Qualquer comando que você esteja usando, trata-o como um nome de arquivo. Observe que o arquivo criado não é um arquivo comum, mas um pipe nomeado que é removido automaticamente quando não é mais necessário.