Observe esta passagem de man bash (ênfase minha):
Coprocessos
Um coprocesso é um comando shell precedido pela palavra reservada coproc. Um coprocesso é executado de forma assíncrona em um subshell, como se o comando tivesse sido finalizado com o operador & control, com um canal bidirecional estabelecido entre o shell em execução e o coprocesso.
Agora, como sabemos, ao contrário de outros sistemas *nix, os pipes do Linux são unidirecionais (também ref man pipe(7) , seção Portabilidade). Então, como o bash coproces alcança o "tubo de duas vias" sem um existente no Linux?
Faz um para stdin e outro para stdout , da mesma forma que os pipes para os subprocessos sempre funcionam. É por isso que você obtém dois fds em uma matriz . Uma extremidade de cada pipe está no pai (como os FDs na matriz) e uma extremidade de cada pipe está no filho (como fd 0 e fd 1, stdin & stdout). Escrever para fd 1 no filho fornece algo para ler
COPROC[0]
e vice-versa para entrada padrão.Essa configuração também é descrita na página man no parágrafo após o que você citou. Não há nada de especial acontecendo, e ele faz a mesma coisa usando a função padrão
pipe
em todos os sistemas, independentemente de como os canais locais funcionam além do que o POSIX fornece.