Чтобы это исправить, вам нужно сделать grep
строковым буфером.Это может зависеть от реализации, но для BSD grep (поставляется с Mac OS X) вам просто нужно добавить параметр --line-buffered
в grep
:
(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep --line-buffered ^[A-Z] >log.log 2>&1 &
со страницы руководства grep
:
--line-buffered
Force output to be line buffered. By default, output is line buffered when standard output is a terminal and block buffered otherwise.
В действительности вы можете проверить это поведение, выдав вместо него STDOUT:
(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] 2>&1 &
В этом случае вам не нужно явно буферизовать строку, потому что это значение по умолчанию,Однако при перенаправлении в файл вы должны явно установить это поведение.