我正试图在一个持续运行的程序输出我想要的详细信息后退出它。下面的命令就是我所拥有的。我希望一旦我在输出中有了值,命令就会完成。相反,命令会无限期地运行。
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; }'
假设您可能还想要一个缩写输出的日志,
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
会继续说话。