从背景过程中读取命名管道

时间:2013-12-18 06:24:02

标签: linux bash shell

我有一个程序,它有一个窗口,也输出到stdout。我正在读取程序输出并将该输出的一行写入管道。这是在程序仍在运行时在后台完成的。我向窗口发送一个命令,等待grep的单行。但是,即使程序已经生成了这个文本尾部也不会退出unitl我停止该程序。

我希望tail尽快返回这一行,这样我就可以用“\ e”终止程序到窗口。

bin/Prog | grep "TEXT" > /tmp/pipe2 &
xvkbd -window Window -text "2"
tail -n1 /tmp/pipe2 >> out.t
xvkbd -window Window -text "\e"

1 个答案:

答案 0 :(得分:2)

tail命令在获得EOF之前不知道它已到达最后一行输入,并且在grep终止并关闭其标准输出之前它不会获得EOF。此外,当输出设备不是“交互式”时,grep将缓冲其输出,并且命名管道不是“交互式”,因此grep的输出将不会被写入管道输入生成EOF,在bin/Prog退出之前不会发生。因此,在程序退出之前,greptail会被卡住,因为您等待greptail退出,然后告诉程序退出,陷入僵局。

您可以使用tail -n +1做得更好,它会在开始时查找一行输出(或sed 1qhead -n 1或...)。但是,你仍然坚持grep缓冲它的输出,这让你陷入困境。