【发布时间】:2021-06-19 21:22:00
【问题描述】:
我是bash 菜鸟,我正在尝试为我正在使用inotifywait 进行的项目设置一种“热重载”功能。 Ubuntu 20.04 如果这很重要。
这就是我希望的工作:
inotifywait -m -r ../.. -e modify,create,delete |
while read line; do
custom_command
done
我有两个问题:
问题 #1 是 custom_command 需要一些时间才能工作,因此如果我同时对目录进行更多更改,custom command 似乎会“排队”custom_command ,我真的只是希望它保留最新的并丢弃其他的。
问题 #2 是我得到了某种“双重输出”。例如,如果我 bash auto-exec.sh 和 auto-exec.sh 看起来像这样:
inotifywait -m -r . -q -e modify,create,delete
然后每次注册更改时,我都会将其作为输出(不是错误,它加倍 - 每次修改时我都会得到两条相同的行):
./ MODIFY auto-exec-testfile.txt
./ MODIFY auto-exec-testfile.txt
我应该注意我已经尝试使用 Visual Code Studio 和 gedit 进行更改,结果相同。
如果我像这样修改bash 文件:
inotifywait -m -r . -q -e modify,create,delete |
while read line; do
echo "$line"
echo "..."
done
每次发生变化时,我都会得到以下输出:
./ MODIFY auto-exec-testfile.txt
...
./ MODIFY auto-exec-testfile.txt
...
如果我将bash_test.sh 修改为以下内容:
inotifywait -m -r . -q -e modify,create,delete |
while read line; do
echo "help me..."
done
然后每次进行更改时我都会得到以下信息:
help me...
help me...
./ MODIFY ... 行发生了什么? 想必我对 bash、stdout 或这里的类似/相关概念有些不理解?
最后,如果我将.sh 文件更改为以下内容:
inotifywait -m -r . -q -q -e modify,create,delete |
while read _; do
echo "help me..."
done
然后我根本没有输出。这个我想我明白了,因为-q -q意味着inotifywait在"super silent" mode中,所以没有日志,因此没有什么可以触发while。
我想做的只是在发生变化时触发代码一次,然后删除除最近执行之外的所有代码。我不确定使用while 这样做是否完全有必要,但我尝试了inotifywait -m -r . -q -q -e modify,create,delete | echo "help me..",并且脚本在启动时打印了一次“帮助我...”,然后在修改时退出。
非常感谢您的帮助。
编辑 - 20201 年 3 月 23 日
我从inotifywait 行中删除了-m 和create,它似乎按预期工作,只是它不会在监控模式下保持“启动”状态。所以这至少只给了我一个来自inotifywait的条目:
notifywait -r .. -q -e modify,delete |
while read line1; do
echo ${line1}
done
相关:
【问题讨论】:
-
您可以在 inotify 选项中添加
--format '%e %f'以查看记录了哪个事件。 -
很难说你想要什么。如果您只想要 1 个事件,请不要使用
-m。 -
多行可能是多个inotify进程运行造成的。也许在每次新尝试使此工作解决该问题之前执行
killall inotifywait(或将其作为第一件事放在脚本中)。 -
确实,当使用
-q调用 inotifywait 时,您不会得到任何输出,因此read将永远不会得到任何东西,因此永远不会返回,并且您的脚本是只是看似坐在那里,显然什么都不做。 -
在我的最后一条评论中写上
-qq。
标签: linux bash while-loop inotify inotifywait