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