inotifywait -m
é o modo "monitor" : ele nunca sai. O shell o executa e aguarda o código de saída para saber se deve executar o corpo do loop, mas isso nunca acontece.
Se você remover -m
, funcionará:
while inotifywait -r -e close_write "/root/secondfolder/"
do
echo "close_write"
done
produz
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.
...
Por padrão, inotifywait irá "sair após o primeiro evento ocorrer", que é o que você quer em uma condição de loop.
Em vez disso, você pode preferir ler a saída padrão de inotifywait
:
#!/bin/bash
while read line
do
echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")
Este script (bash) lerá cada linha de saída do comando inotifywait
na variável $line
dentro do loop, usando substituição de processos . Evita configurar os relógios recursivos todas as vezes em torno do loop, o que pode ser caro. Se você não puder usar o bash, poderá canalizar o comando para o loop: inotifywait ... | while read line ...
. inotifywait
produz uma linha de saída para cada evento nesse modo, então o loop é executado uma vez para cada.