grep与inotifywait结合使用时表现得很奇怪

时间:2016-07-18 18:23:40

标签: bash grep inotify

我很难理解grep返回值的某种异常现象。

如grep手册页中所述,匹配时返回值为零,不匹配/错误/等时返回值为非零。

在此代码中:( bash)

inotifywait -m ./logdir -e create -e moved_to |
  while read path action file; do
    if grep -a -q "String to match" "$path/$file"; then
      # do something  
    fi
  done

匹配时返回非零值。

在此代码中:( bash)

search_file()
{
  if grep -a -q "String to match" "$1"; then
    # do something
  fi
}

inotifywait -m ./logdir -e create -e moved_to |
    while read path action file; do
      search_file "$path/$file"
    done

匹配时返回零。

有人可以向我解释发生了什么事吗?

修改 让我再次明确:如果我在包含该字符串的文件上运行第一个代码,则if语句正在运行。如果我在同一个文件上运行第二个代码,if语句将失败并且不会运行。

1 个答案:

答案 0 :(得分:2)

我支持@John1024猜测他写的是comment

"异常"可能是由于脚本的两个版本之间存在微小的时间差异。如果create事件,该文件最初为空,因此grep将开始扫描部分写入的文件。通过函数调用grep会引入一个小延迟,这会增加搜索数据在grep打开文件时出现在文件中的几率。

这种竞争条件的解决方案取决于几个假设/要求:

  • 您能否认为观看目录中预先存在的文件不会被修改?

  • 您是否希望尽快识别每个新的匹配文件,或者您可以延迟处理它直到它关闭?