O equivalente a command1 | command2
é command2 < <(command1)
Isso pode ser estendido para três (ou mais) comandos também.
command3 < <(command2 < <(command1))
$ lspci | grep 'Network'
02:00.0 Network controller: Qualcomm Atheros AR9285 Wireless Network Adapter (PCI-Express) (rev 01)
$ grep 'Network' <(lspci)
02:00.0 Network controller: Qualcomm Atheros AR9285 Wireless Network Adapter (PCI-Express) (rev 01)
$ lspci | grep 'Network' | grep -o 'controller'
controller
$ grep -o 'controller' < <(grep 'Network' < <(lspci))
controller
No entanto, como Oli sugeriu, embora isso possa produzir a mesma saída, não é tecnicamente o mesmo que um pipe.
& lt; (..) transforma o STDOUT da saída do comando interno em um manipulador de arquivos (que o comando, grep no seu exemplo) é aberto. Quando você canaliza, o comando de leitura está lendo diretamente do STDIN (que está sendo preenchido com o STDOUT do comando canalizado). Diferenças sutis, mas podem ser significativo com comandos que só sabem ler STDIN.