inotifywait -m
це режим "монітор" : він ніколи не вимикається. Оболонка запускає її і чекає коду виходу, щоб знати, чи запускати тіло циклу, але це ніколи не настає.
Якщо ви видалите -m
, він буде працювати:
while inotifywait -r -e close_write "/root/secondfolder/"
do
echo "close_write"
done
виробляє
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
...
За замовчуванням, inotifywait "вийде після того, як відбудеться перша подія", що вам потрібно в умовах циклу.
Натомість ви можете скористатись читанням стандартного виводу inotifywait
:
#!/bin/bash
while read line
do
echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")
Цей (bash) скрипт буде читати кожен вихідний рядок inotifywait
команди у $line
змінну всередині циклу, використовуючи підстановку процесу . Це дозволяє уникнути налаштування рекурсивних годин кожного разу навколо циклу, що може бути дорого. Якщо ви не можете використовувати Баш, ви можете труби команди в петлю замість: inotifywait ... | while read line ...
. inotifywait
створює один рядок виводу для кожної події в цьому режимі, тому цикл працює один раз для кожного.