'Why does my bash for loop hang at a command?

I am using entr to check if new files are added to certain subdirectories, and run a command if such an event occurs. If I have a directory with folders: folder, prefix_folder1, and prefix_folder2, then I want to monitor the presence of new files within a certain subdirectory in the latter two, i.e., monitor prefix_folder1/subdir and prefix_folder2/subdir

This is my current approach with an infinite loop:

  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

However for each directory, the script hangs at line 9 until a new file is created. E.g., if it is at prefix_folder2/subdir it will not echo "hey" if a file is created in prefix_folder1/subdir.

My understanding of bash for loops is limited in this scenario and I'm not sure what keywords to look up to find a solution for this.



Solution 1:[1]

I think this is what you want:

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

This will pass all the directories you want to monitor at once to a single invocation of entr, rather than calling it separately for each directory.

You don't need to include * in the ls command, as that will also monitor all the files in the current directory.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Barmar