Does the tee command always wait for EOF?

2019-05-05 03:29发布

I'd like to log the output of a command to stdout as well as to a log file. I've got Cygwin installed and I'm trying to use the tee command to accomplish this.

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

Trouble is that tee seems to insist on waiting for the end of file before outputting anything to either stdout or the log file. This takes away the point of it all, which is to have a log file for future reference, but also some stdout logging so I can easily see the build progress.

tee's options appear to be limited to --append, --ignore-interrupts, --help, and --version. So is there another method to get to what I'm trying to do?

3条回答
【Aperson】
2楼-- · 2019-05-05 03:33

tee seems to insist on waiting for the end of file before outputting anything to either stdout or the log file.

This should definitely not be happening - it would render tee nearly useless. Here's a simple test that I wrote that puts this to the test, and it's definitely not waiting for eof.

$ cat test
#!/bin/sh
echo "hello"
sleep 5
echo "goodbye"

$ ./test | tee test.log
hello
<pause>
goodbye
查看更多
叼着烟拽天下
3楼-- · 2019-05-05 03:36

Write your own! (The point here is that the autoflush ($|) setting is turned on, so every line seen is flushed straight away. This may perhaps be what the real tee command lacked.)

#!/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;

You can call the script anything you want. I call it perlmilktee! :-P

查看更多
贼婆χ
4楼-- · 2019-05-05 03:47

You can output to the file and tail -f the file.

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

tail -f build.log

查看更多
登录 后发表回答