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
  ...

如果我使用管道和 tee 以这种方式将其记录到文件中,出于任何奇怪的原因:./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有双重用途 - 它从标准输入读取并将输出写入指定文件及其标准输出。结果,您最终会在终端上看到写入日志文件的所有内容,因为没有什么可以“吸收”来自tee.

如果您只想将所有输出写入文件,请改用输出重定向:

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

要包括标准错误:

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