bash:在标准输出上触发输出

时间:2019-01-08 22:27:32

标签: linux bash

我运行了一个向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
...

1 个答案:

答案 0 :(得分:3)

您可以使用tee将第一个程序的输出保存在文件中,同时过滤输出以获取所需的模式。像这样:

./program | tee output.txt | grep --line-buffered pattern | ( while read -r line; do something; done; )

如@thatotherguy在下面的评论中所建议,选项--line-buffered应该阻止grep继续比赛。