当检测到某个输出时自动取消二进制执行

是否有可能以某种方式通过shell运行可执行文件,并在输出中匹配/检测到特定的string时自动使其停止执行? 就像我会手动点击CTRL + C一样?

如果是的话,怎么样?

你可以使用awk

 program | awk '/pattern/{exit}1' 

如果您还想打印包含该模式的行,请说:

 program | awk '/pattern/{print;exit}1' 

例如:

 $ seq 200 | awk '/9/{print;exit}1' 1 2 3 4 5 6 7 8 9 

编辑:(参考你的评论,程序是否会停止。)以下是一个将在无限循环中执行的脚本:

 n=1 while : ; do echo $n n=$((n+1)) sleep 1 done 

这个脚本foo.sh通过说:

 $ time bash foo.sh | awk '/9/{print;exit}1' 1 2 3 4 5 6 7 8 9 real 0m9.097s user 0m0.011s sys 0m0.011s 

如您所见,脚本在输出中检测到模式时终止。


编辑:看来你的程序缓冲输出。 你可以使用stdbuf

 stdbuf -o0 yourprogram | awk '/pattern/{print;exit}1' 

如果你使用mawk ,那么说:

 stdbuf -o0 yourprogram | mawk -W interactive '/pattern/{print;exit}1' 

使用协处理器:

 coproc CO { yourcommand; } while read -ru ${CO[0]} line do case "$line" in *somestring*) kill $CO_PID; break ;; esac done 

请注意,如果命令缓冲其输出,那么在写入管道时所执行的命令数量就会很多,在检测到字符串之前会有一些延迟。