Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Bash grep在shell的stdout中找到特定字符串后立即终止程序_Bash_Shell_Grep_Stdout - Fatal编程技术网

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'
。如果您中断管道,并且写入程序继续向管道写入足以触发信号的内容,则无法避免中断管道信号。阅读方面没有等待;一旦找到字符串,它就会退出。