如果结果超过我的shell上的页面,如何自动管道到更少?

Laz*_*zer 28 linux bash shell

大多数情况下,我不会使用| lessshell中的每个命令.

只有当我实际运行命令时才使用Pipe to less,并发现它不适合页面.这花费了我两次运行相同的shell命令.

是否有一种方法可以使每次命令结果超过显示页面时,它会自动通过管道输送到更少?

Ben*_*son 17

管它到less -Faka --quit-if-one-screen:

如果可以在第一个屏幕上显示整个文件,则会导致自动退出.


Pau*_*ce. 13

尝试这样做最重要的问题是如何在运行需要tty的程序时关闭它.

我建议的是,对于经常使用的程序和实用程序,创建包装它们和管道的shell函数less -F.在某些情况下,您可以将该函数命名为与程序相同,并且它将优先,但可以被覆盖.

这是一个示例包装函数,需要测试,也许还需要一些额外的代码来处理边缘情况等.

#!/bin/bash
foo () {
    if [[ -p /dev/stdout ]]  # you don't want to pipe to less if you're piping to something else
    then
        command foo "$@" | less -F
    else
        command foo "$@"
    fi
}
Run Code Online (Sandbox Code Playgroud)

如果您使用与示例中相同的名称,则可能会破坏期望不同行为的内容.要覆盖函数以直接在其前面运行底层程序command:

command foo
Run Code Online (Sandbox Code Playgroud)

将在foo不使用同名函数的情况下运行.

  • 如果输出不是tty,`less`会优雅地变成`cat`. (5认同)
  • 事实证明,`less -X -F`实现了想要的行为(`-X`禁用更少的功能来清理退出终端).但它有一个副作用,就是在正常运行的'less`上搞乱终端.在某些系统上(例如同一台机器上的虚拟终端),`less -F`按预期工作,而"真实"`less`仍然在退出时清除屏幕. (4认同)