Por que não apenas:
{ echo foo; echo bar;} > /tmp/p
Se você quiser que o script de controle deixe o canal aberto, faça o seguinte:
exec 3<> /tmp/p
Abrir um pipe nomeado no modo de leitura-gravação é evitar que seja bloqueado se o pipe ainda não tiver sido aberto. Isso iria instanciar se ainda não fosse. Ele funciona no Linux, pelo menos, mas não é garantido pelo POSIX.
Como alternativa (e portável):
: < /tmp/p & exec 3> /tmp/p
Então, em vez de cada processo abrir o pipe nomeado, você também pode fazer:
cmd >&3
E no final, você faria:
exec 3>&-
Para fechar o fim da escrita, para que os leitores saibam que está terminado.
altere todos os <
s para >
s e <
s para >
s se você precisar que a lógica seja o contrário.