В зависимости от реальной ситуации вы можете избежать проблемы (вызванной конвейером от tail
до grep
), выполнив все с помощью одного более мощного инструмента, такого как awk
:
while sleep 0.3; do echo "1"; done | awk 'NR > 2 && /1/'
Но, конечно, если вам нужно перенаправить вывод из awk
во что-то еще, у вас просто снова возникнет та же проблема.Но если ваша версия awk
поддерживает ее, вы можете явно сбросить вывод:
while sleep 0.3; do echo "1"; done | awk 'NR > 2 && /1/ {print $0; fflush()}' | | while read x; do echo "read '$x'"; done
... или предположительно использовать unbuffer -p
или stdbuf -oL
на awk
(см. Ответ @ JeffBowman),если они у вас есть (у меня их нет, поэтому я не могу их проверить).