O comando tee sempre esperar por EOF?
-
01-07-2019 - |
Pergunta
Eu gostaria de registrar a saída de um comando para stdout
, bem como para um arquivo de log. Eu tenho Cygwin instalado e eu estou tentando usar o comando tee
para alcançar este objetivo.
devenv mysolution.sln /build myproject "Release|Win32" | tee build.log
O problema é que tee
parece insistir em espera para o final do arquivo antes de emitir qualquer coisa a qualquer stdout
ou o arquivo de log. Isso tira o ponto de tudo isso, o que é ter um arquivo de log para referência futura, mas também alguns logging stdout
para que eu possa ver o progresso de construção.
Opções de tee
parecem estar limitados a --append
, --ignore-interrupts
, --help
e --version
. Então, há outro método para obter o que estou tentando fazer?
Solução
T parece insistir em espera para o final do arquivo antes de emitir qualquer coisa a qualquer stdout ou o arquivo de log.
Este definitivamente não deve estar acontecendo - que tornaria tee quase inútil. Aqui está um teste simples que eu escrevi que põe isso à prova, e definitivamente não está esperando por EOF.
$ cat test
#!/bin/sh
echo "hello"
sleep 5
echo "goodbye"
$ ./test | tee test.log
hello
<pause>
goodbye
Outras dicas
Você pode saída para o arquivo e tail -f arquivo.
devenv mysolution.sln / build myproject "Release | Win32"> build.log &
tail -f build.log
Escreva a sua própria! (O ponto aqui é que a definição autoflush ($|
) está ligado, então cada linha visto é liberado imediatamente. Isto talvez possa ser o que faltava o verdadeiro comando 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;
Você pode chamar o script que quiser. Eu chamo-lhe perlmilktee
! :-P