首先,让我声明这是一个编程问题(因此不属于超级用户等人),因为我说的是 shell 编程。这几乎可能是一个高尔夫问题,但我一开始没有答案,所以任何帮助将不胜感激:-)
所以,故事是:我喜欢用管道输入东西less
,--quit-if-one-screen
因为它很舒服:less
在不必要的时候不会妨碍我。还是这样?当我的提示已经在我的终端窗口底部时,这个选项完全符合我的要求(即less
表现得像cat
)。但是,当我当前的提示位于窗口顶部时,less
首先打印大量空白行以清除屏幕,然后在屏幕底部打印出我的(短)文件,然后它才意识到文本较少比一个屏幕,所以它退出,我得到我的提示。
但是这种行为并不好,因为所有那些无用的空白行。我尝试了不同的选项,或者编写了脚本和别名,我能想到的最好的就是这个(我正在使用 zsh,所以 shell 已经能够复制管道等等):
function catless() {
cat \
>>( bucket -$LINES | cat ) \
>>( bucket +$LINES | less )
}
bucket
我刚刚编写的另一个脚本在哪里,如果它少于 N 行(使用 -N)或多于 N(使用 +N) ,它将stdin复制到stdout 。我把它贴在这里:http ://snipt.net/Gyom/copy-stdin-to-stdout-or-not-depending-on-length
ls | catless
几乎可以工作。但是,出于同步的原因,这里涉及的不同进程无法正确访问终端,并且所有操作都在后台执行(特别是,我less
在这里从来没有得到正确的,并且提示返回得太快了)。但也许我走错了路。
所以,总而言之,我想要的是这样一个函数/脚本/我可以输入的任何内容,ls | catless
它的行为与输出短于一个屏幕时的行为完全相同,而ls | cat
当输出长于屏幕时则如此。ls
ls | less
有任何想法吗 ?