Est-ce que la commande tee attend toujours EOF?
-
01-07-2019 - |
Question
Je souhaite consigner la sortie d'une commande dans stdout
ainsi que dans un fichier journal. Cygwin est installé et j'essaie d'utiliser la commande tee
pour accomplir cela.
devenv mysolution.sln /build myproject "Release|Win32" | tee build.log
Le problème est que tee
semble insister pour attendre la fin du fichier avant de générer quoi que ce soit dans stdout
ou dans le fichier journal. Cela enlève tout intérêt à cela, qui est d'avoir un fichier journal pour référence future, mais aussi une certaine journalisation stdout
afin que je puisse facilement voir la progression de la construction.
Les options de tee
semblent être limitées à - append
, - ignore-interrupts
, - help
et - version
. Y a-t-il une autre méthode pour arriver à ce que j'essaie de faire?
La solution
tee semble insister pour attendre le fin du fichier avant de sortir quoi que ce soit sur la sortie standard ou le fichier journal.
Cela ne devrait absolument pas se produire - cela rendrait le tee presque inutile. Voici un test simple que j'ai écrit qui met cela à l'épreuve, et il n'attend certainement pas eof.
$ cat test
#!/bin/sh
echo "hello"
sleep 5
echo "goodbye"
$ ./test | tee test.log
hello
<pause>
goodbye
Autres conseils
Vous pouvez exporter dans le fichier et suivre -f le fichier.
devenv mysolution.sln / build myproject " Publication | Win32 " > build.log & amp;
tail -f build.log
Ecrivez le vôtre! (Le point ici est que le paramètre autoflush ( $ |
) est activé, donc chaque ligne vue est immédiatement supprimée. C'est peut-être ce qui manquait à la vraie commande tee
.)
#!/usr/bin/perl -w
use strict;
use IO::File;
$| = 1;
my @fhs = map IO::File->new("> Ecrivez le vôtre! (Le point ici est que le paramètre autoflush ( $ |
) est activé, donc chaque ligne vue est immédiatement supprimée. C'est peut-être ce qui manquait à la vraie commande tee
.)
<*>
Vous pouvez appeler le script comme bon vous semble. Je l'appelle perlmilktee
! :-P
"), @ARGV;
while (my $line = <STDIN>) {
print $line;
Ecrivez le vôtre! (Le point ici est que le paramètre autoflush ( $ |
) est activé, donc chaque ligne vue est immédiatement supprimée. C'est peut-être ce qui manquait à la vraie commande tee
.)
<*>
Vous pouvez appeler le script comme bon vous semble. Je l'appelle perlmilktee
! :-P
->print($line) for @fhs;
}
Ecrivez le vôtre! (Le point ici est que le paramètre autoflush ( $ |
) est activé, donc chaque ligne vue est immédiatement supprimée. C'est peut-être ce qui manquait à la vraie commande tee
.)
<*>
Vous pouvez appeler le script comme bon vous semble. Je l'appelle perlmilktee
! :-P
->close for @fhs;
Vous pouvez appeler le script comme bon vous semble. Je l'appelle perlmilktee
! :-P