Suponha que eu queira executar vários programas em paralelo e combinar suas saídas em um único pipe:
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
Essa abordagem de shell funciona bem para esse caso simples, mas espero que falhe se os programas produzirem linhas cada vez mais longas no modo buffer, como este (construído):
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
Uma das soluções que sugeri usar foi tail -f:
tail -n +0 -q -f <(echo qqq; echo qqq2; echo qqq3) <(echo www; echo www2; echo www3) <(echo eee; echo eee2; echo eee3)
, mas esta é uma opção abaixo do ideal: gera dados com lentidão, não termina; Eu vejo as saídas não na ordem "sleep", mas na ordem dos argumentos neste caso:
tail -n +0 -q -f <(sleep 1; echo qqq; sleep 1; echo qqq2; echo qqq3) <(echo www; echo www2; sleep 10; echo www3) <(echo eee; sleep 4; echo eee2; echo eee3) | cat
Eu implementei um pequeno programa especial para isso, mas acredito que deve haver alguma maneira padrão de fazê-lo.
Como fazer isso usando ferramentas padrão (e sem tail -fdesvantagens)?
syslog...
syslognão é para logs, mas para algo personalizado considerado OK?
-sopção de cauda. por exemplo tail -f -s .1 file, reduzirá o atraso do loop para 0,1 segundos do padrão de 1 segundo.