【发布时间】:2016-04-10 03:47:17
【问题描述】:
我想使用 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 正在打印任何内容吗?
-n关闭打印模式空间,因此该命令的唯一输出将是您使用p显式打印的内容。 (我认为...我对 sed 做的不多。)试试cat ~/inputfile | sed -n -r 'some regex'看看是否打印了任何内容。如果不是,那么,你知道为什么! -
在您的前两个示例中,我认为
cat不会被执行。在所有示例中,shell 运行echo(成功),因此它继续执行第二个命令,管道tail | sed。但是tail -f永远不会退出——它只是等待更多数据出现在~/inputfile的末尾。sed可能正在缓冲输出(或者可能根本没有输出),但直到tail退出,sed也不会完成并退出。在tail | sed退出之前,cat不会被执行。 (我认为你根本不需要cat,真的。)~/inputfile后面还有其他进程吗? -
@DaveM。是的 sed 正在使用该组合打印单个捕获组。我可以保证它可以工作并且正在打印一些东西。你对 cat 没有被执行是对的,尽管删除它并没有改变任何东西 - 管道仍然不起作用。是的,另一个进程正在附加到 ~/inputfile,我想将该输出的一部分发送到我的程序。
-
@DaveM。我希望通过使用
&& cat能够通过在终端中输入来保留标准输入,但你是对的,它在那里不起作用。如果我把它放在前面,那么它同样会停止执行 tail 命令。 -
如果您的
sed支持-u(无缓冲)选项,请尝试。在 Debian-8、sed-4.2.2 上为我工作。