Отличный вопрос!Это меня немного озадачило, но я думаю, что знаю, что происходит.Происходит то, что grep
буферизует вывод.Так что, если вы позволите ему бежать, вы увидите, что все это затопит в конце.Если вы используете GNU grep
, попробуйте передать параметр --line-buffered:
(foo bar | grep --line-buffered bar & foo baz &) | tee /tmp/output
Чтобы рискнуть предположить, и учтите, что это по сути то, что это такое, я бы сказал, что grep
буферизует больший вывод, потому что isatty(1)
будет означать, что не записывает в TTY (даже если вы просматриваете вывод в TTY через tee
).Буферизуя больше вывода, он делает меньше вызовов write()
и более эффективен.Привычное поведение запуска grep
и наблюдения за выводом в терминале - буферизация строк - строки появляются по мере их обнаружения.Эта опция заставляет grep
работать в этом режиме.
Имейте в виду, что, как предупреждает man-страница, это может повлиять на производительность grep
.