Dado o extrato, essa linha é bloqueada, aguardando para ler os dados do canal:
./a.out <$fifo >$out & pid=$!
Nada vai acontecer até que alguém escreva para o fifo. Isso precisa ser outro processo. Normalmente, você faria um processo de leitura em segundo plano e escreveria para o fifo em primeiro plano, ou vice-versa. Aqui, você está lendo, e depois o seu script escreve no pipe: isso não faz sentido.
No script completo que você postou, o leitor é executado em segundo plano:
./$program <$fifo >$out &
Eu não li o seu script completo - você precisa trabalhar em escrevendo um exemplo mínimo completo . Eu acho que o problema que você está enfrentando é que o fim do arquivo ao ler de um pipe nomeado acontece assim que um escritor fecha o pipe. Mas você tem muitos escritores:
echo "$debugpolecenie" > $fifo
…
echo "$liniain" >> $fifo
( >
e >>
não fazem diferença em um pipe, a propósito, mas você vai querer usar >>
se você mudar para um arquivo de log.)
Você precisa abrir o pipe para escrever exatamente uma vez. Abra-o em outro descritor de arquivos.
mkfifo $fifo
exec 3>$fifo
…
echo "$debugpolecenie" >&3
…
exec 3>&- # to close the fifo
ou use o agrupamento, em que todo o código que grava no pipe está dentro das chaves:
{
…
} 3>$fifo