与管道的奇怪的蒸汽更新者行为

时间:2012-11-11 21:34:58

标签: linux bash pipe steam

这个节目的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
  ...

出于任何奇怪的原因,如果我使用管道和T恤将其记录到文件中:./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不会创建任何子项或额外进程

2 个答案:

答案 0 :(得分:2)

我猜程序正在检查isatty(3)以决定是否显示进度输出。如果是这种情况,那么如果你把它捕获到文件中,你可能不会得到非常合理的输出,因为它可能使用各种控制字符来使输出更加人性化。

通过运行以下命令连接到TTY时,您可以尝试捕获程序的输出:

script -c "./steam -command update ..." logfile

答案 1 :(得分:1)

tee具有双重目的 - 它从标准输入读取并将输出写入指定文件及其标准输出。因此,您最终会看到所有写入终端日志文件的内容,因为没有任何内容可以“吸收”tee的输出。

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

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

包含标准错误:

./steam [args...] 2>&1 >> log