1

このプログラムのSTDOUTには奇妙な振る舞いがあります。

プログラムを実行した場合: 次を./steam -command update -game "Counter-Strike Source" -dir . 出力します:

Checking bootstrapper version ...
Updating Installation
Determining which depot(s) to install/update...
5 depot(s) will be installed/updated
  0:02 Checking local files and building download list for depot 242 'Counter-Strike Source Shared' version 129
  0:02     Connecting content server session for version 129
  0:03     [80.239.194.162:27030] Connecting...
  0:06     [80.239.194.162:27030] Failed.  Failed to connect to 80.239.194.162:27030, errno 115 "Operation now in progress"
  0:06     [81.171.68.195:27030] Connecting...
  0:07     [81.171.68.195:27030] Connection established; handshaking...
  0:08     [81.171.68.195:27030] Sending login message...
  0:08     Fetching version 129 manifest
  ...

奇妙な理由で、パイプとティーを使用して次のようにファイルにログインした場合./steam -command update -game "Counter-Strike Source" -dir . | tee log :プログラムを出力するのは次のとおりです。

Checking bootstrapper version ...
Updating Installation
Determining which depot(s) to install/update...
5 depot(s) will be installed/updated

そしてそれ以上は何もありません。同じテキストがログファイルと画面にあります。それでも、プログラムはファイルの更新を開始します。なぜこれが起こっているのか考えていますか?

注:欠落している行はSTDERRからのものではありません

注2:./steamは子や追加のプロセスを作成しません

4

2 に答える 2

2

isatty(3)プログラムは進行状況の出力を表示するかどうかを決定するためにチェックしていると思います。その場合、出力をより人間に優しいものにするためにさまざまな制御文字を使用している可能性があるため、ファイルにキャプチャした場合、おそらくあまり賢明な出力は得られません。

次のコマンドを実行して、TTYに接続されているときにプログラムの出力をキャプチャしてみることができます。

script -c "./steam -command update ..." logfile
于 2012-11-11T23:14:34.227 に答える
1

teeには2つの目的があります。標準入力から読み取り、出力を指定されたファイルとその標準出力に書き込みます。その結果、からの出力を「吸収」するものがないため、端末のログファイルに書き込まれているすべてのものが表示されることになりますtee

すべての出力をファイルに書き込みたいだけの場合は、代わりに出力リダイレクトを使用してください。

./steam [args...] >> log

標準エラーを含めるには:

./steam [args...] 2>&1 >> log
于 2012-11-11T21:46:55.903 に答える