Припустимо, я хочу паралельно виконувати кілька програм і об'єднати їхні результати в одну трубу:
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
Цей підхід оболонки добре працює в цьому простому випадку, але я очікую, що він вийде з ладу, якщо програми виводять більше і довші рядки в буферний спосіб, як це (побудовано):
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
Одним із рішень, які я натякав на використання, було 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)
, але це неоптимальний варіант: він виводить дані мляво, вони не припиняються; Я бачу результати не в "сплячому" порядку, а в порядку аргументів в цьому випадку:
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
Я реалізував для цього спеціальну маленьку програму, але вважаю, що для цього повинен бути якийсь стандартний хороший спосіб.
Як це зробити за допомогою стандартних інструментів (і без tail -fнедоліків)?
syslog...
syslogне для журналів, а для чогось на замовлення?
-sваріант для хвоста. наприклад tail -f -s .1 file, зменшиться затримка циклу до .1 секунди від 1 секунди за замовчуванням.