[英]Redirecting tail output into a program
我想使用tail作为stdin从文本文件中发送程序最新的行。
首先,我向程序回显一些每次都相同的输入,然后从输入文件中发送尾输入,该输入文件应首先通过sed处理。 以下是我期望工作的命令行。 但是当程序运行时,它只接收回声输入,而不是尾部输入。
(echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat) | ./program
但是,以下工作完全符合预期,将所有内容打印到终端:
echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat
所以我尝试了另一种类型的输出,并且在发布回声文本的同时,尾部文本没有出现在任何地方:
(echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex') | tee out.txt
这让我觉得这是一个缓冲问题,但我尝试了unbuffer
程序和所有其他建议( https://superuser.com/questions/59497/writing-tail-f-output-to-another-file )结果。 尾部输出在哪里,如何让它按预期进入我的程序?
当我使用以下内容为sed命令添加前缀时解决了缓冲问题:
stdbuf -i0 -o0 -e0
使用非缓冲更为可取,这对我来说根本不起作用。 Dave M建议使用sed相对较新的-u似乎也可以解决问题。
有一件事你可能会感到困惑 - |
(管道)优先于&&
(连续执行)。 所以当你说
(echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat) | ./program
这相当于
(echo "new" && (tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex') && cat) | ./program
所以cat
并没有真正做任何事情,而且sed
输出可能有点缓冲。 您可以尝试使用-u
选项sed
使其使用无缓冲输出:
(echo "new" && (tail -f ~/inputfile 2> /dev/null | sed -n -u -r 'some regex')) | ./program
我相信当输出是一个终端时,某些版本的sed
默认为-u
,而不是当它是一个管道时,所以这可能是你所看到的差异的来源。
您可以在sed
使用i
命令(有关详细信息,请参阅联机帮助页中的命令列表)以在开头执行插入:
tail -f inputfile | sed -e '1inew file' -e 's/this/that/' | ./program
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.