如何捕捉任何shell输出?

我们正在devise一个浏览器中的shell,将stream式传输所有的shell输出。 stdout,stderr,任何东西。

然而,正如这个小例子向你展示的那样,

git clone https://github.com/joyent/node.git >./git.out cat ./git.out 

大部分的输出不会被赋予./git.out。 这里是小video,如果你想看看发生了什么事http://screencast.com/t/7zTdPfq7Pr7

我们需要像“顶”,“混帐”的命令工作,任何想法如何得到他们?

(输出到一个文件只是为了说明的目的,我们会把每一行的输出stream到另一个系统,我们知道top是没有意义的,但是我希望我的观点对于那些能够提供洞察力的人来说是足够清楚的。 )

大多数程序有两个输出:stdout和stderr。 标准输出是“主要”信息的来源。 stderr被用于错误。 它也被用于各种不重要的输出,有时也会用户提示。

要捕获所有这些,您需要将stderrredirect到stdout。

 somecmd arg1 arg2 arg3 >somefile 2>&1 

或者将stderr捕获到一个单独的文件:

 somecmd arg1 arg2 arg3 >stdout.txt 2>stderr.txt 

请注意,程序可能使用其他输出而不是stdout / stderr。 它可以确定您的控制台,并在那里基本上“强制”输出。 然而,这是非常罕见的,以上将在99%的情况下工作。

需要注意的一点是,如果将stdout和stderr都redirect到同一个文件,那stdout和stderr缓冲区就不一样了,所以它在日志文件中看起来不会像屏幕上那样(行会出错)。 另外,对于您的具体实例,您的输出将看起来像垃圾。 git做了很多terminal操作(进度指示器),并且在一个日志文件中它看起来非常糟糕。

编辑

man git-clone

– 进展
当连接到terminal时,默认情况下标准错误stream会报告进度状态,除非指定-q。 即使标准错误stream没有指向terminal,该标志也会强制进行状态