Grep并在循环条件下同时打印到stdout

时间:2019-01-09 17:17:37

标签: bash shell unix

我每60秒运行一次测试,直到测试失败。它工作正常,但我想同时打印“ npm test”的输出。

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 :(得分:1)

您可以尝试

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

npm测试的输出发送到stderr。因此,相同的文本输入stdout和stderr。 stdout由grep处理,stderr打印到终端。

答案 1 :(得分:0)

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

exec打开带有数字3的新文件描述符,它将其输出重定向到文件描述符1,即标准输出。

然后在until条件下,我们将tee的输出{{3}}到文件描述符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