我编写了一个 bash 脚本来监视特定目录/root/secondfolder/
:
#!/bin/sh
while inotifywait -mr -e close_write "/root/secondfolder/"
do
echo "close_write"
done
fourth.txt
当我创建一个名为in 的文件/root/secondfolder/
并向其中写入内容、保存并关闭它时,它会输出以下内容:
/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt
但是,它不会回显“close_write”。这是为什么?
答案1
inotifywait -m
是“监视”模式: 它永远不会退出。 shell 运行它并等待退出代码来知道是否运行循环体,但这永远不会到来。
如果删除-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
循环内的变量中:流程替代。它避免了每次循环时都设置递归监视,这可能会很昂贵。如果您无法使用 bash,则可以将命令通过管道传输到循环中:inotifywait ... | while read line ...
。inotifywait
在此模式下,每个事件都会生成一行输出,因此每个事件循环运行一次。