Bash grep在shell的stdout中找到特定字符串后立即终止程序
我有一个后续问题。然而,这篇文章给出的答案并不适合我的问题。例如Bash grep在shell的stdout中找到特定字符串后立即终止程序,bash,shell,grep,stdout,Bash,Shell,Grep,Stdout,我有一个后续问题。然而,这篇文章给出的答案并不适合我的问题。例如 /somecommand | grep-q'string'和&echo'matched' 一旦somecommand完成并且grep在其stdout中找到“string”,就会抛出“matched”。在我的例子中,我希望在“string”被管道传输到grep命令之后立即终止somecommand。 到目前为止,我已经 /somecommand | sed'/string/q' 但我想知道是否存在比等待管道破裂信号更好的解决方案。这
/somecommand | grep-q'string'和&echo'matched'
一旦somecommand完成并且grep在其stdout中找到“string”,就会抛出“matched”。在我的例子中,我希望在“string”被管道传输到grep命令之后立即终止somecommand。
到目前为止,我已经
/somecommand | sed'/string/q'
但我想知道是否存在比等待管道破裂信号更好的解决方案。这取决于
somecommand
在做什么。让我们假设它在stdout上连续生成一些内容。在这种情况下,关闭管道将终止命令,但即使这样也不意味着somecommand
在生成有问题的字符串时终止,而只在grep
接收到带有该字符串的行时终止。缓冲开始发挥作用
但是,如果somecommand
每隔一段时间才在stdout上生成一次内容,那么关闭管道只会在下一次输出期间终止它,并且在这期间它可能会保持沉默。在这种情况下,接收部分(grep
在您的情况下,但它也可能是您这边专门定制的程序)需要知道发送方的PID(somecommand
),以便它可以杀死它
如果这是必要的,您可以编写脚本,使用例如
ps
或pstree来搜索执行somecommand
且与终止进程具有相同父PID的进程,以找出要终止的进程;毕竟,可能会有几个执行somecommand
的实例,您不想杀死错误的一个。这取决于somecommand
在做什么。让我们假设它在stdout上连续生成一些内容。在这种情况下,关闭管道将终止命令,但即使这样也不意味着somecommand
在生成有问题的字符串时终止,而只在grep
接收到带有该字符串的行时终止。缓冲开始发挥作用
但是,如果somecommand
每隔一段时间才在stdout上生成一次内容,那么关闭管道只会在下一次输出期间终止它,并且在这期间它可能会保持沉默。在这种情况下,接收部分(grep
在您的情况下,但它也可能是您这边专门定制的程序)需要知道发送方的PID(somecommand
),以便它可以杀死它
如果这是必要的,您可以编写脚本,使用例如
ps
或pstree来搜索执行somecommand
且与终止进程具有相同父PID的进程,以找出要终止的进程;毕竟,可能会有多个执行somecommand
的实例,您不想杀死错误的一个。如果您不想要该部分,只需省略&&echo“matched”
。如果您中断管道,并且写入程序继续向管道写入足以触发信号的内容,则无法避免中断管道信号。阅读方面没有等待;一旦找到字符串,它就会退出。如果您不想要该部分,只需省略&&echo'matched'
。如果您中断管道,并且写入程序继续向管道写入足以触发信号的内容,则无法避免中断管道信号。阅读方面没有等待;一旦找到字符串,它就会退出。