我在正确使用inotifywait方面遇到了困难。
我的环境是CentOS 8流,有i7-9700
test.sh
#!/bin/bash
inotifywait -e modify ./test.txt |
while read dirname eventlist filename
do
echo "Event catch!"
done
echo "I am doing next thing"output in terminal(stdout)
[root@ceph examples]# sh test.sh
Setting up watches.
Watches established.
I am doing next thing我想要什么?
我希望我的脚本打印一行“事件捕获!”。如您所见,我的bash脚本忽略了所有时间循环块,只需打印“我正在做下一件事”。
发布于 2022-06-27 10:42:03
inotifywait的正常行为是在捕获事件后退出。
如果希望inotifywait继续监视事件,则必须使用-m选项开关。
同样在您的脚本中,如果是inotifywait,则从输出中读取3个参数,而如果只有一个事件,则可能只返回2个参数。您可以使用--format选项来保持可预测的输出格式。
#!/bin/sh
inotifywait -m -e modify ./test.txt |
while read -r filename eventlist
do
printf 'Event catch!\nfilename=%s, eventlist=%s\n' "$filename" "$eventlist"
done
printf %s\\n "I am doing next thing"如果要退出inotifywait,只需从管道中关闭父进程即可。
示例:
#!/bin/sh
max_events=2
inotifywait -m -e modify ./test.txt |
while read -r filename eventlist
do
printf 'Event catch!\nfilename=%s, eventlist=%s\n' "$filename" "$eventlist"
max_events=$((max_events - 1))
[ 0 -eq "$max_events" ] && kill $$
done
printf %s\\n "I am doing next thing"现在使用用于事件和读取受控格式的Bash数组:
#!/bin/bash
max_events=2
while
# Reads file name
read -r -d '' filename &&
# and reads event list in an array
read -r -a eventlist
do
declare -p filename eventlist
printf 'Event catch!\nfilename! %s\neventlist: %s\n' "$filename" \
"${eventlist[*]}"
((--max_events)) || break
done < <(
inotifywait --format '%w%0%e' --monitor --event MODIFY ./test.txt
)
printf %s\\n "I am doing next thing"https://stackoverflow.com/questions/72770323
复制相似问题