inotifywait -m
jest trybem „monitor” : nigdy nie wychodzi. Powłoka je uruchamia i czeka na kod wyjścia, aby wiedzieć, czy uruchomić ciało pętli, ale to nigdy nie nadchodzi.
Jeśli usuniesz -m
, będzie działać:
while inotifywait -r -e close_write "/root/secondfolder/"
do
echo "close_write"
done
produkuje
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.
...
Domyślnie inotifywait „zakończy działanie po wystąpieniu pierwszego zdarzenia”, co jest pożądane w warunkach pętli.
Zamiast tego możesz przeczytać standardowe wyjście inotifywait
:
#!/bin/bash
while read line
do
echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")
Ten skrypt (bash) wczyta każdy wiersz wyjściowy inotifywait
polecenia do $line
zmiennej wewnątrz pętli, stosując podstawienie procesu . Pozwala to uniknąć ustawiania zegarów rekurencyjnych za każdym razem w pętli, co może być kosztowne. Jeśli nie można używać bash, można rura polecenia do pętli zamiast: inotifywait ... | while read line ...
. inotifywait
tworzy jeden wiersz wyjścia dla każdego zdarzenia w tym trybie, więc pętla działa raz dla każdego.