在不创建额外进程的情况下在脚本中使用 inotifywait -m?

Use inotifywait -m in script without creating extra process?

我不确定这是否可行,但我经常这么想,而且一些解决方案让我感到惊讶。是否可以在不创建两个进程的情况下创建以下脚本的等效项(在这种情况下,很明显创建了两个进程,因为有一个管道):

#!/bin/bash

EVENTS="CREATE,CLOSE_WRITE,DELETE,MODIFY,MOVED_FROM,MOVED_TO"
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing | \
  while true; do
    read TMP
    echo "${TMP}" >> ~/Desktop/eventlog
  done

请注意,在 while 循环内我确实想访问该事件。

在我看来,管道是必需的,因为我们需要用一个进程写入并从另一个进程读取。但也许有什么窍门?

假设您希望避免使用辅助脚本以便在 for 循环中修改的变量在循环完成后不会丢失其值是否正确?

在那种情况下,你可以交换等等

while read TMP; do
  echo "${TMP}" >> ~/Desktop/eventlog
done < <(inotifywait -e "$EVENTS" -m -r ~/Desktop/testing)

但是如果您担心代码流的灵活性 您可以重定向到文件句柄,然后随时从该句柄读取 如果你想让我找出例子,请在下面评论

如果是其他事情 - 请添加有关您实际想要做什么的详细信息

bash 4.2 中,您可以设置 lastpipe 选项以允许 while 循环到当前 shell 中的 运行 而不是单独的过程。

shopt -s lastpipe
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing |
  while true; do
    read TMP
    echo "${TMP}" >> ~/Desktop/eventlog
  done

(您不需要在 | 之后显式续行,因为 bash 知道一行不能以该字符结尾。)