A substituição do processo é aproximadamente equivalente a isso.
Exemplo - mecânica de substituição de processo
Passo # 1 - faça um fifo, envie para ele
$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492
Passo # 2 - leia o fifo
$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+ Done fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1
O uso de parênteses dentro do HEREDOC também parece OK:
Exemplo - usando apenas um FIFO
Etapa # 1 - saída para FIFO
$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628
Passo # 2 - leia o conteúdo do FIFO
$ cat /var/tmp/fifo1
(one)
(two
O problema, acredito que você está se deparando é que a substituição do processo, <(...)
, não parece se importar com o aninhamento de parênteses dentro dele.
Exemplo - processo sub + HEREDOC não funciona
$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing ')' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$
Escapar dos parênteses parece satisfazê-lo um pouco:
Exemplo - parênteses fugitivos
$ cat <(fmt --width=10 <<FOO
\(one\)
\(two
FOO
)
\(one\)
\(two
Mas realmente não te dá o que você quer. Tornar os parentes equilibrados também parece apaziguá-lo:
Exemplo - balanceamento de parentes
$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)
Sempre que eu tenho strings complexas, como essa para lidar com o Bash, eu quase sempre as construo primeiro, armazenando-as em uma variável, e então as uso através da variável, em vez de tentar criar um liner complicado que acaba sendo frágil.
Exemplo - use uma variável
$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)
Em seguida, imprima:
$ echo "$var"
(one)
(two