我在 bash 中有以下行。
(sleep 1 ; echo "foo" ; sleep 1 ; echo "bar" ; sleep 30) | nc localhost 2222 \
| grep -m1 "baz"
这会打印“baz”(如果/当 TCP 连接的另一端发送它时)并在 32 秒后退出。
我想让它做的是在看到“baz”时退出 sleep 30
early。 -m 标志退出 grep,但不会终止整行。
我如何在 bash 中实现这一点(如果可能,不使用 expect
)?
更新:当且仅当服务器尝试在 baz 之后发送内容时,上面的代码才会退出。这并不能解决这个问题,因为服务器可能会在几分钟内不发送任何内容。
最佳答案
如果您喜欢 Bash 深奥的一面,您可以为此使用 coproc
。
coproc { { sleep 1; echo "foo"; sleep 1; echo "bar"; sleep 30; } | nc localhost 2222; }
grep -m1 baz <&${COPROC[0]}
[[ $COPROC_PID ]] && kill $COPROC_PID
在这里,我们使用coproc
来运行
{ { sleep 1; echo "foo"; sleep 1; echo "bar"; sleep 30; } | nc localhost 2222; }
在后台。 coproc
负责在 ${COPROC[0]}
和 ${COPROC[ 中设置的文件描述符中重定向此复合命令的标准输出和标准输入1]}
。此外,此作业的PID
在COPROC_PID
中。然后,我们将后台作业的标准输出提供给 grep
。完成后很容易终止工作。
关于bash - 让 grep 在找到匹配项时提前退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26777283/