这个程序的stdout中有一个奇怪的behaivour。
如果我执行程序: ./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
Note2:./Steam不会创建任何孩子或额外的过程
我想该程序正在检查isatty(3)
,以决定是否显示进度输出。如果是这样,那么如果您确实将其捕获到文件,您可能不会获得非常明智的输出,因为它可能使用了各种控制字符来使输出更加人性化。
通过运行连接到TTY时,您可以尝试捕获该程序的输出:
script -c "./steam -command update ..." logfile
tee
具有双重目的 - 它从标准输入中读取,并将输出写入指定的文件和其标准输出。结果,您最终会看到终端上日志文件写入的所有内容,因为没有什么可以"吸收" tee
的输出。
如果您只想将所有输出写入文件,请改用输出重定向:
./steam [args...] >> log
包括标准错误:
./steam [args...] 2>&1 >> log