Grep и печать на стандартный вывод одновременно в состоянии цикла - PullRequest
0 голосов
/ 09 января 2019

Я запускаю тест каждые 60 секунд, пока он не завершится неудачей. Это работает нормально, но я хотел бы напечатать вывод «теста npm» в то же время.

until npm test | grep -m 1 "fail"; do sleep 60 ; done && say fail

Я пытался использовать tee, как в следующей команде, но он просто запускает цикл один раз:

until npm test | tee >(grep -m 1 "fail"); do sleep 60 ; done && say fail

Я использую OS X.

Ответы [ 2 ]

0 голосов
/ 09 января 2019
exec 3>&1; 
until npm test | tee >(cat >&3) | grep -q -m 1 "fail"; do sleep 60 ; done && say fail

exec открывает новый файловый дескриптор с номером 3, который перенаправляет его вывод в файловый дескриптор 1, который является stdout.

Затем в until состоянии мы tee выводим в файловый дескриптор 3.

Вы можете быть умнее и экономить cat s:

exec 3>&1; 
until npm test | tee /proc/self/fd/3 | grep -q -m 1 "fail"; do sleep 60 ; done && say fail
0 голосов
/ 09 января 2019

Вы можете попробовать

until npm test | tee /dev/stderr | grep -m 1 "fail"; do sleep 60 ; done && say fail

Результат теста npm tee'd to stderr. То же самое относится и к stdout и stderr. Stdout обрабатывается grep, а stderr выводится на терминал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...