是否有可能以某种方式通过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
请注意,如果命令缓冲其输出,那么在写入管道时所执行的命令数量就会很多,在检测到字符串之前会有一些延迟。