首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >inotifywait等待忽略while循环

inotifywait等待忽略while循环
EN

Stack Overflow用户
提问于 2022-06-27 10:08:07
回答 1查看 67关注 0票数 1

我在正确使用inotifywait方面遇到了困难。

我的环境是CentOS 8流,有i7-9700

test.sh

代码语言:javascript
复制
#!/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)

代码语言:javascript
复制
[root@ceph examples]# sh test.sh
Setting up watches.
Watches established.
I am doing next thing

我想要什么?

我希望我的脚本打印一行“事件捕获!”。如您所见,我的bash脚本忽略了所有时间循环块,只需打印“我正在做下一件事”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-27 10:42:03

inotifywait的正常行为是在捕获事件后退出。

如果希望inotifywait继续监视事件,则必须使用-m选项开关。

同样在您的脚本中,如果是inotifywait,则从输出中读取3个参数,而如果只有一个事件,则可能只返回2个参数。您可以使用--format选项来保持可预测的输出格式。

代码语言:javascript
复制
#!/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,只需从管道中关闭父进程即可。

示例:

代码语言:javascript
复制
#!/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数组:

代码语言:javascript
复制
#!/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"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72770323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档