inotifywait -m
est le mode "moniteur" : il ne quitte jamais. Le shell l'exécute et attend que le code de sortie sache s'il faut exécuter le corps de la boucle, mais cela n'arrive jamais.
Si vous supprimez -m
, cela fonctionnera:
while inotifywait -r -e close_write "/root/secondfolder/"
do
echo "close_write"
done
produit
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.
...
Par défaut, inotifywait "se fermera après le premier événement", ce que vous voulez dans une condition de boucle.
Au lieu de cela, vous préférerez peut-être lire la sortie standard de inotifywait
:
#!/bin/bash
while read line
do
echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")
Ce script (bash) lira chaque ligne de sortie de la inotifywait
commande dans la $line
variable à l'intérieur de la boucle, en utilisant la substitution de processus . Cela évite de configurer les montres récursives à chaque fois dans la boucle, ce qui pourrait être coûteux. Si vous ne pouvez pas utiliser bash, vous pouvez diriger à la place la commande dans la boucle: inotifywait ... | while read line ...
. inotifywait
produit une ligne de sortie pour chaque événement dans ce mode, de sorte que la boucle s'exécute une fois pour chacun.