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)