【问题标题】:Shell script re-directing output with tee command buffers output in some cases and not in others在某些情况下,使用 tee 命令缓冲输出而不在其他情况下,Shell 脚本重定向输出
【发布时间】:2011-09-11 11:22:49
【问题描述】:

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

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

tee -a >>pipe

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

tail -f pipe

我看不懂的结果:

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

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

【问题讨论】:

    标签: shell unix tail tee


    【解决方案1】:

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

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

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

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

    tail -n +1 -f pipe
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2017-08-10
      • 2020-06-20
      • 1970-01-01
      • 2010-10-12
      • 2019-08-08
      相关资源
      最近更新 更多