如何优雅地退出双管道连续命令



我正试图在一个持续运行的程序输出我想要的详细信息后退出它。下面的命令就是我所拥有的。我希望一旦我在输出中有了值,命令就会完成。相反,命令会无限期地运行。

wscat -c <web_socket_url> | sed -u -n <my_pattern> | head -n 1

需要澄清的是:"wscat"是我不断运行的程序。我正在尝试过滤输出,以便只得到我需要的东西。我试图通过使用"head"将输出的行限制为1来退出该命令。

使用进程替换只等待管道中的最后一个阶段的常见技巧:

head -n 1 < <(wscat -c <web_socket_url> | sed -u -n <my_pattern>)

虽然wscatsed进程将挂起一段时间,直到它们尝试输出并导致SIGPIPE向后传播,但一旦head退出,脚本本身将立即继续。

自行退出sed

wscat -c <web_socket_url> | sed -u -n /my_pattern/{ p; q; }' 

假设您可能还想要一个缩写输出的日志,

wscat -c <web_socket_url> | tee $logname | sed -u -n /my_pattern/{ p; q; }' 

当接收程序终止时,这仍然可能崩溃并结束wscat。如果要完成其余输出,请不要关闭管道。

wscat -c <web_socket_url> | sed -u -n /my_pattern/p'

即使sed只输出你想传递的东西,它仍然会在听,所以wscat会继续说话。

最新更新