Bash 如何在shell中包含某个文件后继续

Bash 如何在shell中包含某个文件后继续,bash,Bash,我正在编写一些bashshell脚本,它将持续检查一个文件,看看该文件是否已经包含已完成的内容!在继续之前。当然,假设文件正在更新,并且最终将包含短语Completed 我不知道该怎么做。谢谢您的帮助。您可以执行以下操作: while ! grep -q -e 'Completed!' file ; do sleep 1 # Or some other number of seconds done # Here the file contains completed 您可以执行以下操作:

我正在编写一些bashshell脚本,它将持续检查一个文件,看看该文件是否已经包含已完成的内容!在继续之前。当然,假设文件正在更新,并且最终将包含短语Completed


我不知道该怎么做。谢谢您的帮助。

您可以执行以下操作:

while ! grep -q -e 'Completed!' file ; do
  sleep 1 # Or some other number of seconds
done

# Here the file contains completed

您可以执行以下操作:

while ! grep -q -e 'Completed!' file ; do
  sleep 1 # Or some other number of seconds
done

# Here the file contains completed

在标准的实用程序中,有一个保持从文件读取的选项:tail-f。所以过滤tail-f的输出


这假定该文件正被其他工具附加到。如果在启动tail后,该文件被数据生成程序覆盖,则此解决方案将不起作用。你可以。在某些系统上,您可以调用通知机制来了解文件何时更改,例如Linux下的。

在标准实用程序中,有一个选项可以保持从文件读取:tail-f。所以过滤tail-f的输出


这假定该文件正被其他工具附加到。如果在启动tail后,该文件被数据生成程序覆盖,则此解决方案将不起作用。你可以。在某些系统上,您可以调用通知机制,以了解文件何时更改,例如Linux下的。

我在Kornshell中已经这样做了:

tail -f somefile | while read line
do
    echo $line
    [[ $line == *Completed!* ]] && break
done
请注意,*已完成!*周围没有引号一串这允许双方括号进行全局模式匹配,而不是字符串匹配

这似乎在BASH中也适用。但是,具有已完成的行必须以NL结尾。否则,它将在中断循环之前占用额外的一行

您也可以使用grep:

q参数表示安静。如果您的grep没有接受-q参数,那么您可能必须将其管道传输到/dev/null。-我是忽略的情况。你是否想那样做取决于你自己


这样做的好处是,除非有一行要读,否则不会进行任何处理。使用sleep可能意味着您错过了这一行,或者您正在处理尚未添加到文件中的任何行。

我在Kornshell中这样做过:

<some_file tail -f -n +1 | sed -e '/Completed!/ q'
tail -f somefile | while read line
do
    echo $line
    [[ $line == *Completed!* ]] && break
done
请注意,*已完成!*周围没有引号一串这允许双方括号进行全局模式匹配,而不是字符串匹配

这似乎在BASH中也适用。但是,具有已完成的行必须以NL结尾。否则,它将在中断循环之前占用额外的一行

您也可以使用grep:

q参数表示安静。如果您的grep没有接受-q参数,那么您可能必须将其管道传输到/dev/null。-我是忽略的情况。你是否想那样做取决于你自己


这样做的好处是,除非有一行要读,否则不会进行任何处理。使用sleep可能意味着您错过了该行,或者您正在处理尚未添加到文件中的行。

在管道中使用grep,您可以通过添加-line buffered选项打开行缓冲模式

在管道中使用grep,您可以通过添加-line buffered选项打开行缓冲模式

如果你想让Completed上的匹配不区分大小写,你可以在grep后面加-i。如果你想让Completed上的匹配不区分大小写,你可以在grep后面加-i。
<some_file tail -f -n +1 | sed -e '/Completed!/ q'