将尾部输出重定向到程序中
我想用一个文本文件使用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