我有一个程序,它有一个窗口,也输出到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"
答案 0 :(得分:2)
tail
命令在获得EOF之前不知道它已到达最后一行输入,并且在grep
终止并关闭其标准输出之前它不会获得EOF。此外,当输出设备不是“交互式”时,grep
将缓冲其输出,并且命名管道不是“交互式”,因此grep
的输出将不会被写入管道输入生成EOF,在bin/Prog
退出之前不会发生。因此,在程序退出之前,grep
和tail
会被卡住,因为您等待grep
和tail
退出,然后告诉程序退出,陷入僵局。
您可以使用tail -n +1
做得更好,它会在开始时查找一行输出(或sed 1q
或head -n 1
或...)。但是,你仍然坚持grep
缓冲它的输出,这让你陷入困境。