Não estou claro sobre o que você quis dizer com tail -f $(tail -F PIPEOUT) & . É tail -f ing o arquivo que é o resultado de tail -F , que convencionalmente nunca termina. Minha suposição é que você quer dar saída de tudo o que vem pelo pipe, não importa quanto tempo demore.
O problema com apenas tail -f é que ele precisa encontrar o final do arquivo antes de gerar qualquer saída, o que para o pipe nunca acontece. Você pode dar a tail um ponto inicial explícito, em vez de -n +x , escolhendo a linha para comece em (desde o início, 1 indexado). tail -n 1 -f foo exibirá tudo o que puder obter de foo .
tr 'a-z' 'A-Z' < PIPEIN > PIPEOUT & # for example
tail -n +1 -f PIPEOUT &
for i in a b c d ; do
echo $i > PIPEIN
done
echo "[stdin end]" > PIPEIN
Observe, no entanto, que echo > foo fechará o foo após escrever a linha - o comando do outro lado precisará ter prazer em lidar com isso. Se este exemplo é artificial e a entrada real vem de outro lugar, você pode desconsiderar isso.
Note também que o processo tail nunca terminará - ele espera que algo mais venha pelo canal. Você terá que matá-lo explicitamente, talvez com o controle do trabalho do seu shell. Se houver algum padrão na saída que indique que foi feito, talvez você encontre retail ("tail with regular expressions") útil - retail -n +1 -f -u REGEX PIPEOUT terminará quando uma linha correspondente a REGEX aparecer. (Como aviso de isenção, eu escrevi retail alguns anos atrás para este propósito exato)