为什么我的 bash for 循环在命令处挂起?

Why does my bash for loop hang at a command?

我正在使用 entr 检查是否有新文件添加到某些子目录,如果发生此类事件,我会使用 运行 命令。如果我有一个包含文件夹的目录:folderprefix_folder1prefix_folder2,那么我想监视后两个子目录中某个子目录中是否存在新文件,即监视 prefix_folder1/subdirprefix_folder2/subdir

这是我目前的无限循环方法:

  1 #!/bin/bash
  2 
  3 trap "exit" INT # in case of ^C
  4 while true
  5 do
  6     for stage in $(ls '/Users/me/test')
  7     do
  8         if [[ "$stage" == "prefix"* ]]; then #check for prefix
  9             ls -d * /Users/me/test/$stage/subdir | entr -pd echo hey
 10 
 11         fi
 12     done
 13 done

但是对于每个目录,脚本在第 9 行挂起,直到创建新文件。例如,如果它位于 prefix_folder2/subdir,如果在 prefix_folder1/subdir.

中创建文件,则它不会 echo“嘿”

我对 bash for 循环的理解在这种情况下是有限的,我不确定要查找哪些关键字来找到解决方案。

我想这就是你想要的:

while true
do
    ls -d /Users/me/test/prefix*/subdir | entr -pd echo hey
done

这会将您要监视的所有目录一次传递给 entr 的单个调用,而不是为每个目录分别调用它。

您不需要在ls命令中包含*,因为它也会监控当前目录中的所有文件。