Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如果结果超过我的shell上的一页,如何自动将管道传输到更少?_Linux_Bash_Shell - Fatal编程技术网

Linux 如果结果超过我的shell上的一页,如何自动将管道传输到更少?

Linux 如果结果超过我的shell上的一页,如何自动将管道传输到更少?,linux,bash,shell,Linux,Bash,Shell,大多数情况下,我不会对shell中的每个命令使用|less 只有当我在没有is的情况下实际运行命令并发现它不适合页面时,才使用“管道到较少”这需要我运行两次相同的shell命令。 是否有一种方法可以使每次命令结果超过显示页面时,它都自动通过管道传输到less?您可以始终通过管道传输到less-E(这将导致less在文件末尾自动退出)。对于具有短输出的命令,它将执行您想要的操作。我认为,当有大量输出时,您无法自动将管道输送到更少的位置。一般来说,自动输送到更少的位置需要shell对其运行的命令将产

大多数情况下,我不会对shell中的每个命令使用
|less

只有当我在没有is的情况下实际运行命令并发现它不适合页面时,才使用“管道到较少”这需要我运行两次相同的shell命令。


是否有一种方法可以使每次命令结果超过显示页面时,它都自动通过管道传输到less?您可以始终通过管道传输到less-E(这将导致less在文件末尾自动退出)。对于具有短输出的命令,它将执行您想要的操作。我认为,当有大量输出时,您无法自动将管道输送到更少的位置。

一般来说,自动输送到
更少的位置需要shell对其运行的命令将产生的输出具有预见性,而如果不尝试让程序这样做,人类很难预测到这一点


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

将其导入
less-F
aka
--如果有一个屏幕,请退出:

如果可以删除整个文件,则会导致less自动退出- 在第一个屏幕上播放


尝试这样做最重要的问题是如何在运行需要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 foo

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

我编写了此包装函数,并将其放入.profile中。您可以在命令之前使用它,如果它超过1页,它将自动将其压缩到更少

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

因此“lcmd ls”将ls当前目录,并将该输出传输到less

@BenV:为什么?对我来说,编写shell似乎是一个非常好的问题。
less
如果输出不是tty,则会优雅地变成
cat
。在某些情况下,
less-F
如果可以放在一页上,则似乎会丢弃输出。我无法确定它取决于哪些设置。@t.Verron:你说的“扔掉”是什么意思?结果是
less-X-F
实现了想要的行为(
-X
在退出时禁用less功能来清洁终端)。但它的副作用是在正常运行
less
时弄乱终端。在某些系统上(例如,同一台机器上的虚拟终端),
less-F
按预期工作,并且“real”
less
在退出时仍会清理屏幕。比测试管道可靠性更好的方法是:
如果[[-t1]];然后做点什么|少-F;否则就做些什么;如果输出长度超过最大命令行长度,则fi
使用回波将中断<代码>“$@”|小于-F
就足够了。分号也是不必要的。