2014-12-04 3 views
3
(echo foo && sleep 1 && echo bar) | grep -P . | tee /dev/null 

Приведенный выше код является самым маленьким случаем моей проблемы, с которой я мог бы придумать. Ожидаемое поведение заключается в том, что foo будет эхо, второй пройдет, затем будет bar.grep, tee, и сон не играет хорошо вместе

Что на самом деле происходит, так это то, что вторая проходит, тогда foo и bar являются одновременно эхо-сигналами. Если вы удалите либоgrep, либо команду tee (или оба, очевидно), произойдет правильное поведение. Но вместе с ними это не так.

Я предполагаю, что это какая-то проблема буферизации, но я не знаю, как обойти ее. Фактический скрипт для меня работает довольно долго, и я не вижу сообщений журнала до самого конца. Halp! :(

+0

возможно дубликата. [Баш: процесс exec'd силы, чтобы иметь небуферизованный стандартный вывод] (http://stackoverflow.com/questions/3332045/bash-force-execd-process-to-have-unbuffered-stdout) –

+3

Под «правильным» и «ожидаемым» вы подразумеваете «желаемый». Поведение, которое вы видите, это как правильные, так и ожидаемые. –

+0

http://mywiki.wooledge.org/BashFAQ/009 – tripleee

ответ

4

комментарий Этан побудил меня посмотреть через страницу человека Grep и я нашел --line-buffered флаг Добавив, что проблема решена,

(echo foo && sleep 1 && echo bar) | grep --line-buffered -P . | tee /dev/null 
Смежные вопросы