Deve-se observar que a substituição do processo não se limita ao formulário <(command), que usa a saída commandcomo um arquivo. Pode estar no formato >(command)que alimenta um arquivo como entrada commandtambém. Isso também é mencionado na citação do manual do bash na resposta do @ enzotib.
Para o date | catexemplo acima, um comando que usa a substituição de processo do formulário >(command)para obter o mesmo efeito seria,
date > >(cat)
Observe que o >antes >(cat)é necessário. Isso pode ser novamente ilustrado claramente echocomo na resposta de @ Caleb.
$ echo >(cat)
/dev/fd/63
Portanto, sem o extra >, date >(cat)seria o mesmo date /dev/fd/63que imprimirá uma mensagem para stderr.
Suponha que você tenha um programa que apenas use nomes de arquivos como parâmetros e não processe stdinou stdout. Usarei o script simplificado demais psub.shpara ilustrar isso. O conteúdo de psub.shé
#!/bin/bash
[ -e "$1" -a -e "$2" ] && awk '{print $1}' "$1" > "$2"
Basicamente, ele testa se ambos os seus argumentos são arquivos (não necessariamente arquivos regulares) e, se esse for o caso, escreva o primeiro campo de cada linha "$1"para "$2"usar o awk. Então, um comando que combina tudo o que foi mencionado até agora é,
./psub.sh <(printf "a a\nc c\nb b") >(sort)
Isso imprimirá
a
b
c
e é equivalente a
printf "a a\nc c\nb b" | awk '{print $1}' | sort
mas o seguinte não funcionará, e temos que usar a substituição de processo aqui,
printf "a a\nc c\nb b" | ./psub.sh | sort
ou sua forma equivalente
printf "a a\nc c\nb b" | ./psub.sh /dev/stdin /dev/stdout | sort
Se ./psub.shtambém ler stdinalém do mencionado acima, esse formulário equivalente não existe e, nesse caso, não podemos usar nada em vez da substituição do processo (é claro que você também pode usar um pipe nomeado ou um arquivo temporário, mas isso é outro história).