将程序输出导入到less中不会显示输出开头

19

我想在我的目录中制作一堆文件,但这些文件会生成大约200行的错误,因此它们会在终端屏幕上飞速滚动,我必须向上滚动以阅读它们。

我希望将显示在屏幕上的输出管道到一个分页程序中,让我可以从开头开始阅读错误。但是当我尝试时

make | less
less不能显示输出的开头,它显示通常导向屏幕输出的末尾,并告诉我输出只有1行。 当我尝试键入Gg时,屏幕上唯一的行是执行的makefile的行,常规屏幕输出消失了。
我是否使用less不正确? 我以前从未真正使用过它,并且在像sh myscript.sh | less这样的东西中也遇到了类似的问题,其中它不会立即显示输出文件的开头。
2个回答

20

make的错误信息会出现在标准错误流(C语言中的stderr)中,这个流不能通过普通管道进行重定向。如果你希望将其重定向到less,需要使用make |& less (csh等)或make 2>&1 | less (sh、bash等)。


Acccha,我以为它与那有关,但我尝试了 make | less 2>&1。重定向位置错了。 - Kevin Burke
1
请简要解释一下 2>&1|& 的作用是什么? - winklerrr

13

错误输出被发送到一个稍微有些不同的地方,这个地方不会被正常管道所捕获,因为你经常想要看到错误,但不希望它们和你要进一步处理的数据混在一起。对于这种情况,你可以使用重定向:

$ make 2>&1 | less

bashzsh 中(以及它们从中借鉴了此特性的 csh/tcsh),可以将其缩短为

$ make |& less

对于像make这样容易产生大量错误的事情,我通常会将输出捕获到文件中,以后再用less查看该文件:

$ make |& tee make.log
$ less make.log

我尝试在Bash中使用make |& less,但是出现了语法错误。 - Kevin Burke
看起来旧版的 bash 没有这个功能;OSX 上的系统 bash (3.2) 不支持它,但是MacPorts中的 bash 4 和 Maverick 的标准 bash 都支持它。 - geekosaur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接