将尾部输出重定向到程序中

我想用一个文本文件使用tail作为标准输入发送程序最近的行。

首先,我向程序回应一些每次都会相同的输入,然后从应该首先通过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 

更可取的是使用unbuffer,它甚至不适合我。 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
链接地址: http://www.djcxy.com/p/42703.html

上一篇: Redirecting tail output into a program

下一篇: Piping curl followed by an echo some times truncates the output when using tail