如何捕获任何 shell 输出?

如何捕获任何 shell 输出?

我们正在浏览器中设计一个 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,否则默认情况下,当连接到终端时,进度状态会在标准错误流上报告。即使标准错误流未定向到终端,此标志也会强制显示进度状态

相关内容