【问题标题】:Does the tee command always wait for EOF?tee 命令是否总是等待 EOF?
【发布时间】:2008-09-20 00:32:01
【问题描述】:

我想将命令的输出记录到stdout 以及日志文件中。我已经安装了 Cygwin,我正在尝试使用 tee 命令来完成此操作。

devenv mysolution.sln /build myproject "Release|Win32" | tee build.log

问题在于tee 似乎坚持等待文件结束,然后再将任何内容输出到stdout 或日志文件。这消除了这一切的意义,即有一个日志文件供将来参考,还有一些 stdout 日志记录,以便我可以轻松查看构建进度。

tee 的选项似乎仅限于 --append--ignore-interrupts--help--version。那么还有其他方法可以实现我想要做的事情吗?

【问题讨论】:

    标签: command-line cygwin


    【解决方案1】:

    你可以输出到文件和tail -f文件。

    devenv mysolution.sln /build myproject "Release|Win32" > build.log &

    tail -f build.log

    【讨论】:

      【解决方案2】:

      tee 似乎坚持等待 在输出任何东西之前文件结束 到标准输出或日志文件。

      这绝对不应该发生 - 它会使 tee 几乎无用。这是我写的一个简单的测试,它对它进行了测试,它绝对不是在等待 eof。

      $ cat test
      #!/bin/sh
      echo "hello"
      sleep 5
      echo "goodbye"
      
      $ ./test | tee test.log
      hello
      <pause>
      goodbye
      

      【讨论】:

      • @jon:是的,看来我的问题实际上是 devenv.exe 在构建大型解决方案时以某种方式阻塞了事情。我尝试使用自己的 T 恤替换件,但遇到了同样的问题。
      【解决方案3】:

      写你自己的! (这里的重点是 autoflush ($|) 设置已打开,因此看到的每一行都会立即刷新。这可能是真正的tee 命令所缺少的。)

      #!/usr/bin/perl -w
      use strict;
      use IO::File;
      $| = 1;
      my @fhs = map IO::File->new(">$_"), @ARGV;
      while (my $line = <STDIN>) {
          print $line;
          $_->print($line) for @fhs;
      }
      $_->close for @fhs;
      

      您可以随意调用脚本。我称之为perlmilktee! :-P

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        • 2017-06-30
        • 2022-08-18
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        相关资源
        最近更新 更多