Minha resposta anterior não foi uma solução ideal, como descobri mais tarde. Ele tem três falhas: uma que não fecha quando stdin é fechado (eof em stdin). Em segundo lugar, cat (e outros utilitários como tee e tal) têm algumas características bizarras quando se trata de fechar o final de leitura do pipe para o qual ele está gravando (se você fechar e reabrir a extremidade de leitura do pipe Ele irá começar a armazenar todos os dados e apenas liberá-lo quando este processo parar, claramente um stopper para mim). E, em terceiro lugar, o processo em segundo plano, neste caso, pode ser órfão.
Depois de lidar com esses problemas, aqui está meu novo script, que aborda todos os três problemas acima. Espero que seja bom para alguém.
#!/bin/ksh
#
# USAGE
# helper <path_to_CLIENT_TO_SERVER_pipe> <path_to_SERVER_TO_CLIENT_pipe>
#
CS=$1
SC=$2
exec 3>&0
trap 'exit;' CHLD
{
while read LINE; do #STDIN -> CS
print $LINE >>$CS;
done;
} <&3 &
while true; do #SC -> STDOUT
read IN <$SC;
retCode=$?
if [[ $retCode -eq 0 ]]; then
print $IN;
else
sleep 1;
fi
done
Neste caso, temos apenas um processo em segundo plano, o único que lê stdin. Se stdin fechar, sairá e nós prenderemos isso e sairemos do script em primeiro plano. O script de primeiro plano nunca precisa sair porque está lendo de um canal, o que ele sempre deve fazer, independentemente do que acontece na outra extremidade desse pipe. O uso de leitura, embora menos eficiente, não apresenta problemas de armazenamento em buffer quando os processos externos que estão lendo / gravando para os pipes fornecidos são ativados ou desativados. Este script só existe quando stdin está fechado.