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