我运行了一个向stdout
写很多东西的程序。一段时间后,该程序将定义的行打印到stdout
上,我需要触发该行才能并行调用一个函数(不终止第一个程序)。
如何在bash中执行此操作?
更多解释:我需要运行一个安装程序,该程序可以从已安装的 dvd1.iso 中执行。一段时间后,它将打印“信息:弹出DVD 1并插入DVD 2以继续。”。这将是自动完成的。
在这里回答我的测试设置:
talker.sh
#!/bin/bash
for VAR in {1..20}
do
sleep 1s
echo "huhu $VAR"
done
listener.sh
#!/bin/bash
bash talker.sh \
| tee output.txt \
| grep --line-buffered "huhu 3" \
| ( while read -r line; do echo "found"; done; ) &\
tail -f output.txt
及其工作方式:
$ bash listerner.sh
huhu 1
huhu 2
huhu 3
found
huhu 4
huhu 5
...
答案 0 :(得分:3)
您可以使用tee
将第一个程序的输出保存在文件中,同时过滤输出以获取所需的模式。像这样:
./program | tee output.txt | grep --line-buffered pattern | ( while read -r line; do something; done; )
如@thatotherguy在下面的评论中所建议,选项--line-buffered
应该阻止grep
继续比赛。