我们正在浏览器中设计一个 shell,它将传输 shell 输出的所有内容。stdout、stderr,任何东西。
然而,正如这个小例子向你展示的那样,
git clone https://github.com/joyent/node.git >./git.out
cat ./git.out
大多数输出没有提供给 ./git.out。这里有一个小视频,如果你想看看发生了什么http://screencast.com/t/7zTdPfq7Pr7
我们需要像‘top’、‘git’这样的命令才能工作,有什么想法如何获取它们吗?
(输出到文件仅用于说明目的,我们将把每一行输出流式传输到另一个系统,我们知道top
这没有意义,但我希望我的观点对于能够提供见解的人来说足够清楚。谢谢。)
答案1
大多数程序都有两个输出:stdout 和 stderr。stdout 是“主要”信息输出的地方。stderr 用于错误。它还用于各种不重要的输出,有时也用于用户提示之类的内容。
要捕获所有内容,您需要将 stderr 重定向到 stdout。
somecmd arg1 arg2 arg3 >somefile 2>&1
或者将 stderr 捕获到单独的文件中:
somecmd arg1 arg2 arg3 >stdout.txt 2>stderr.txt
请注意,程序可以使用除 stdout / stderr 之外的其他输出。它可以确定您的控制台并基本上“强制”在那里输出。然而,这种情况极为罕见,上述方法在 99% 的情况下都有效。
如果您将 stdout 和 stderr 重定向到同一个文件,需要记住的一点是,stdout 和 stderr 缓冲不同,因此日志文件中的内容与屏幕上的内容不同(行顺序会乱)。此外,对于您的特定实例,您的输出看起来会像垃圾。git 进行了大量终端操作(用于进度指示器),在日志文件中看起来会非常糟糕。
编辑
从man git-clone
:
--progress
除非指定 -q,否则默认情况下,当连接到终端时,进度状态会在标准错误流上报告。即使标准错误流未定向到终端,此标志也会强制显示进度状态