【发布时间】:2010-12-06 16:41:41
【问题描述】:
首先,让我声明这是一个编程 问题(因此不属于超级用户et.al.),因为我说的是shell 编程。这几乎可能是一个高尔夫问题,但我一开始没有答案,所以任何帮助将不胜感激:-)
所以,故事是:我喜欢使用--quit-if-one-screen 选项将内容导入less,因为它非常舒适:less 在不必要的时候不会妨碍我。还是这样?当我的提示已经在我的终端窗口底部时,这个选项完全符合我的要求(即less 的行为类似于cat)。但是,当我当前的提示位于窗口顶部时,less 首先打印大量空白行以 clear 屏幕,然后在屏幕底部打印出我的(短)文件,然后它才意识到文本少于一个屏幕,所以它退出并且我得到了我的提示。
但是这种行为并不好,因为所有那些无用的空白行。我尝试了不同的选项,或者编写了脚本和别名,我能想到的最好的就是这个(我正在使用 zsh,所以 shell 已经能够复制管道等等):
function catless() {
cat \
>>( bucket -$LINES | cat ) \
>>( bucket +$LINES | less )
}
bucket 是我刚刚编写的另一个脚本,如果它少于 N 行(带 -N)或多于 N(与+N)。
我把它贴在这里:http://snipt.net/Gyom/copy-stdin-to-stdout-or-not-depending-on-length
而ls | catless 几乎可以正常工作。但是,出于同步的原因,这里涉及的不同进程无法正确访问终端,并且一切都在后台执行(特别是,我在这里从来没有得到正确的less,并且提示返回得太快了)。但也许我走错了路。
所以,总而言之,我想要的是这样一个函数/脚本/任何我可以输入 ls | catless 并且当 ls 的输出更短时它的行为完全类似于 ls | cat超过一屏,更长的时候喜欢ls | less。
有什么想法吗?
【问题讨论】:
-
这是个好问题。我认为不可能使用带有文件句柄的 shell 作为管道源/目标来解决它,即使 shell 能够复制句柄。可能使用 Powershell 或 IPython 可能是一种选择,但这只是一种猜测。