tee コマンドは常に EOF を待機しますか?
-
01-07-2019 - |
質問
コマンドの出力をログに記録したいのですが、 stdout
ログファイルにも記録されます。Cygwin がインストールされており、使用しようとしています tee
これを達成するためのコマンド。
devenv mysolution.sln /build myproject "Release|Win32" | tee build.log
問題はそれです tee
どちらかに何かを出力する前に、ファイルの終わりを待つことを主張しているようです stdout
またはログファイル。これでは、今後の参照のためにログ ファイルを作成するという重要な点が失われますが、いくつかの点も失われます。 stdout
ログを記録するので、ビルドの進行状況を簡単に確認できます。
tee
のオプションは以下に制限されているようです --append
, --ignore-interrupts
, --help
, 、 そして --version
. 。それで、私がやろうとしていることを達成するための別の方法はありますか?
解決
Teeは、STDOUTまたはログファイルのいずれかに何かを出力する前に、ファイルの終了を待つことを主張しているようです。
これは絶対にあってはなりません。T シャツがほとんど役に立たなくなります。これをテストするために私が書いた簡単なテストを次に示します。これは間違いなく eof を待機しません。
$ cat test
#!/bin/sh
echo "hello"
sleep 5
echo "goodbye"
$ ./test | tee test.log
hello
<pause>
goodbye
他のヒント
ファイルに出力し、ファイルを tail -f することができます。
devenv mysolution.sln /build myproject "Release|Win32" > build.log &
tail -f build.log
自分で書いてみましょう!(ここでのポイントは、自動フラッシュ ($|
) 設定がオンになっているため、表示されるすべての行がすぐにフラッシュされます。おそらくこれが本当の姿なのかもしれない 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