Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何优雅地退出双管道连续命令_Linux_Bash - Fatal编程技术网

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

Linux 如何优雅地退出双管道连续命令,linux,bash,Linux,Bash,我试图退出一个持续运行的程序,一旦它输出了我要寻找的细节。 下面的命令就是我所拥有的。我希望在输出中获得值后,命令会完成。相反,命令会无限期地运行 wscat -c <web_socket_url> | sed -u -n <my_pattern> | head -n 1 澄清一下:“wscat”是我持续运行的程序。我试图过滤输出,以便只得到我需要的。我试图通过使用“head”将输出行限制为1来退出该命令。使用进程替换仅等待管道中的最后一个阶段的常见技巧: head -

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

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>)
虽然wscat和sed进程将挂起一段时间,直到它们尝试输出并导致SIGPIPE向后传播,但一旦head退出,脚本本身将立即继续。

让sed自行退出

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

即使只输出您想要传递的内容,sed仍将侦听,因此wscat将继续对话。

如果wscat从未终止,则可能是它没有正确响应SIGPIPE,或者它没有生成足够的数据来获取SIGPIPE。无论哪种情况,短期解决方案都是发送一个期限。前一种情况下的长期修复是修复wscat,以便它正确响应SIGPIPE.HI。我正在尝试实施所有建议的解决方案。其他方法似乎没有给出期望的结果:在sed和printed匹配的第一个输出之后立即退出wscat。我也尝试了你的命令,但我似乎无法正确使用sed命令:wscat-c | sed-u-n的/*令牌代码:\[0-9]\+\\\.*/\1/p'你能试着根据这一点调整你的命令吗?不管我上面的评论是什么,它现在正与@另一个人的建议一起工作。谢谢你抽出时间。
wscat -c <web_socket_url> | tee $logname | sed -u -n /my_pattern/{ p; q; }' 
wscat -c <web_socket_url> | sed -u -n /my_pattern/p'