Como uso o exec 3> myfifo em um script e não tenho eco foo> & 3 fechar o pipe?

Por que não consigo usar o exec 3> myfifo da mesma maneira em um script bash que posso no meu termina

Estou usando pipes nomeados para transformar um filtro awk em um "servidor" simples, capaz de receber entrada de texto dos clientes, filtrá-la e liberar NU

No terminal 1, o servidor está executando assim:

$ mkfifo to_server from_server;
$ while true; do 
  # Really, this awk script BEGIN's with reading in a huge file, 
  # thus the client-server model
  awk '{sub("wrong", "correct");print;} /\0/ {fflush();}' <to_server >from_server; 
  echo "restarting..."; 
done

E eu tenho um script simples que deve colocar a entrada, terminando com um NUL, no canal de entrada, e ler a partir do tubo de saída e depois sair, sem enviar um EOF para o servidor (não queremos o servidor para reiniciar):

#!/bin/bash
# According to http://mywiki.wooledge.org/BashFAQ/085 , using 
# `exec 3>mypipe; echo foo >&3;` instead of `echo foo >mypipe` 
# should ensure that the pipe does not get the EOF which closes it:
exec 3>to_server;
exec 4<from_server;

cat >&3;
echo -e '\0' >&3;
while read -rd '' <&4; do echo -n "$REPLY"; break; done;

Agora, se eu no terminal 2 fizer$ echo This is wrong | bash client.sh, Eu receboThis is correct back, mas o terminal 1 mostra que o servidor reinicia! Se eu executar os comandos do client.sh no terminal 2, ele não será reiniciad

Parece estar relacionado aos comandos exec, pois também posso fazer

$ exec 3>to_server; exec 4<from_server;
$ echo "This is wrong" | sh client.sh

e não reinicia. Se eu então

$ exec 3>&-; exec 4<&-

(que obviamente reinicia uma vez) e faça

$ echo "This is wrong" | sh client.sh

reinicia sempre. Portanto, parece que os comandos exec no script não têm efeito. No entanto, colocandols /proc/$$/fd/ após os comandos exec no script mostrarem que, de fato, apontam para os pipes correto

O que estou perdendo aqui

questionAnswers(2)

yourAnswerToTheQuestion