1

我已将 shell 脚本简化为两个命令:

终端 A(将 STDIN 重定向到命名管道):

tee -a >>pipe

终端 B(从上面使用的管道读取):

tail -f pipe

我不明白的结果:

  • 结果 1开始 tee,开始 tail:第一个终端的任何输入都将被缓冲,并且仅在 tee 命令停止(ctrl-c)后显示在第二个终端。
  • 结果2开始发球,开始发球,停止发球,再次开始发球:现在只有每一行都被缓冲(我想要的结果)。结果显示在终端 2 的每一行输入到终端 1 的末尾。
  • 结果 3(对于它的价值):首先开始 tail,然后 tee:与#1相同的结果。

我还使用 exec 和 cat 命令编写了一个类似的脚本,它表现出相同的行为。

4

1 回答 1

0

我不是这方面的专家,但这种行为似乎很简单。

假设你申请tail的是一个普通的文本文件;它将打印最后 10 行并退出。如果使用tail -f,它将打印最后 10 行,然后监视文件;从那时起,它将打印附加到文件的每个新行。这是您正在寻找的行缓冲。

现在应用于tail -f命名管道。你在另一端放的任何东西就像文件的初始内容一样,tail耐心地等待结束,以便它可以打印“最后”10行。当该过程结束时,它通过管道发送一个“文件结束”符号(我不知道那是什么,只知道它存在),然后tail打印 - 并开始监控。如果您随后启动一个或多个写入管道tail的新进程,则将新行视为新行并将它们打印出来。

如果您想缓冲和打印所有行,您可以启动和停止三通来启动泵,或者只是使用

tail -n +1 -f pipe
于 2011-06-09T20:40:52.013 回答