【问题标题】:Piping program output to less does not display beginning of the output管道程序输出到 less 不显示输出的开头
【发布时间】:2011-07-28 11:22:03
【问题描述】:

我正在尝试make 我目录中的一堆文件,但是这些文件正在生成大约 200 行错误,因此它们飞过我的终端屏幕太快了,我必须向上滚动才能阅读它们。

我想将屏幕上显示的输出通过管道传输到寻呼机,让我从头开始读取错误。但是当我尝试

make | less

less 不显示输出的开头 - 它显示通常通过管道传输到屏幕的输出的结尾,然后告诉我输出是 1 行长。当我尝试输入Gg 时,屏幕上唯一的一行是执行的makefile 行,并且常规屏幕输出消失了。

我是否错误地使用了less?我以前从未真正使用过它,并且我遇到了类似的问题,例如sh myscript.sh | less,它不会立即显示输出文件的开头。

【问题讨论】:

    标签: unix pipe


    【解决方案1】:

    来自make 的错误出现在标准错误流(C 中的stderr)上,它不会被普通管道重定向。如果您还想将其重定向到less,则需要make |& less(csh 等)或make 2>&1 | less(sh、bash 等)。

    【讨论】:

    • Acccha,我认为这与此有关,但我尝试了make | less 2>& 1。重定向在错误的地方。
    • 能否请您简单解释一下2>&1|& 的作用?
    【解决方案2】:

    错误输出被发送到一个稍微不同的地方,普通管道不会捕获到,因为您经常希望看到错误,但又不想将它们与您要进一步处理的数据混合在一起。对于这样的事情,您使用重定向:

    $ make 2>&1 | less
    

    bashzsh(以及csh/tcsh,这是他们借用它的地方)可以缩短为

    $ make |& less
    

    对于像make 这样容易产生很多错误的东西,我稍后会检查,我通常将输出捕获到一个文件,然后less 该文件稍后:

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

    【讨论】:

    • 我尝试在 bash 中使用 make |& less,但出现语法错误。
    • Hrm,貌似老bash没有; OSX 上的系统 bash (3.2) 不接受它,但 MacPorts 的 bash 4 接受它,Maverick 上的标准 bash 也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    相关资源
    最近更新 更多