代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

如果结果超过shell上的一页,如何自动转换为less?

  •  28
  • Aakash Goel  · 技术社区  · 14 年前

    基本上,我不会用 | less 对于shell中的每个命令。

    Pipe to less仅在我实际运行不带is的命令并发现它不适合页面时使用。 我花了两次运行同一个shell命令的时间。

    有没有一种方法可以让每次命令结果超过一个显示页面时,它都会自动通过管道传输到更少的页面?

    5 回复  |  直到 9 年前
        1
  •  13
  •   Dennis Williamson    14 年前

    要做到这一点,最重要的问题是如何在运行需要tty的程序时将其关闭。

    我建议,对于您经常使用的程序和实用程序,创建外壳函数来包装它们并将其管道连接到 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
    }
    

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

    command foo
    

    将运行 foo 不使用同名函数。

        2
  •  17
  •   Ben Jackson    14 年前

    管它到 less -F 阿卡 --quit-if-one-screen :

    如果整个文件可以是DIS,则导致自动退出。 在第一个屏幕上播放。

        3
  •  2
  •   GWW    14 年前

    您总是可以通过管道连接到less-E(这将导致less在文件末尾自动退出)。对于输出较短的命令,它可以按您的要求执行。我认为当有很多输出时,你不能自动地用管道连接到less。

        4
  •  2
  •   Jonathan Leffler    14 年前

    通常,自动管道连接到 less 要求shell对它运行的命令所产生的输出有预见性,而且如果不让程序这么做,人类很难预测到这一点。

    您可以编写一个shell来为您执行此操作—捕获输出(但是stderr呢?)如果需要的话,可以分页,但它肯定不是一个标准的shell。

        5
  •  1
  •   Jonathan    13 年前

    我编写了这个包装器函数并将其放入我的.profile中。您可以在命令之前使用它,如果它超过1页,它将自动将其管道设置为less。

    lcmd ()
    {
        echo "$("$@")" | less -F;
    };
    

    所以'lcmd ls'将ls当前目录和输出到less的管道。