我有一个命令,它将做一些活动,将在屏幕上显示消息,其中包含字“继续”。只要找到该字,我想杀死该命令。我尝试了以下语法,但它不起作用。
Command_to_run >> "logfile" 2>&1 & pid=$! while ! grep -q "continue" "$logfile" ; do sleep 1 done kill -$pid
8tntrjer1#
您可以使用coproc来执行此操作
coproc
#! /bin/bash coproc ./command_to_run until [[ $line =~ continue ]]; do read -r -u ${COPROC[0]} line done kill $COPROC_PID
如果你真的需要日志文件,你可以在循环中写入它。
bakd9h0s2#
一种方法是让command_to_run将输出重定向到一个管道,并在请求的输出出现在输出中时立即关闭管道。当标准输出关闭时,大多数命令在尝试向stdout写入新内容时将立即退出。以下是如何实现这一目标的一个示例:文件command_to_run:
command_to_run
#!/bin/bash echo start seq 2 echo continue seq 10 echo end
$ ./command_to_run | tee logfile | awk '1;/continue/{exit}' start 1 2 continue
或者,如果不需要输出显示在stdout中,可以使用grep:
grep
./command_to_run | tee logfile | grep -q continue $ cat logfile start 1 2 continue
值得一提的是,OP中的代码几乎可以正常工作,只是需要一些小的调整:
logfile
continue
--
./command_to_run > "logfile" 2>&1 & pid=$! while ! grep -q "continue" "logfile" ; do sleep 1 done kill -- -$pid
2条答案
按热度按时间8tntrjer1#
您可以使用
coproc
来执行此操作如果你真的需要日志文件,你可以在循环中写入它。
bakd9h0s2#
一种方法是让
command_to_run
将输出重定向到一个管道,并在请求的输出出现在输出中时立即关闭管道。当标准输出关闭时,大多数命令在尝试向stdout写入新内容时将立即退出。
以下是如何实现这一目标的一个示例:
文件
command_to_run
:或者,如果不需要输出显示在stdout中,可以使用
grep
:值得一提的是,OP中的代码几乎可以正常工作,只是需要一些小的调整:
grep
命令中logfile
的美元符号,以匹配上面使用的名称logfile
,以便continue
字符串不存在于之前的执行中--
,以便负PID(组)不被评估为信号编号。