команда отправляется в grep и перенаправляется в файл - PullRequest
0 голосов
/ 01 марта 2019

Я хотел бы использовать следующую команду в bash:

(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] >log.log 2>&1 &

к сожалению, до тех пор, пока она не будет завершена (например, при помощи команды ppid of sleep), файл log.log пуст, ноФайл out.out содержит ожидаемое содержимое.

  1. Сначала я хочу понять, что происходит
  2. Я бы хотел это исправить.

1 Ответ

0 голосов
/ 01 марта 2019

Чтобы это исправить, вам нужно сделать 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 &

В этом случае вам не нужно явно буферизовать строку, потому что это значение по умолчанию,Однако при перенаправлении в файл вы должны явно установить это поведение.

...