dargaud Asked: 2018-09-07 04:24:59 +0800 CST2018-09-07 04:24:59 +0800 CST 2018-09-07 04:24:59 +0800 CST 使用“少”在屏幕上保留小文件的文本 772 我很确定很久以前在某些同事系统上看到了这种对 less 命令的定制,以模仿“更多”。我想要的是: 如果文件很短(不到一屏长),它的行为应该像 cat:它显示文件的内容并退出。 如果文件长于一个屏幕,它应该像往常一样运行,等待用户输入并在退出时清除其屏幕并将先前的命令留在屏幕上。 我尝试过使用 less -FX 进行试验,但它会在屏幕上为大文件留下大量内容。 shell less 3 个回答 Voted mosvy 2018-09-07T06:12:43+08:002018-09-07T06:12:43+08:00 如果我理解正确,您希望为大文件保留备用屏幕切换行为,并仅为适合单个屏幕且不需要滚动的小文件打开 -X 开关。 这现在是 530 版中的默认行为less;NEWS从文件的源代码中引用: 较少版本 487 和 530 之间的主要变化 -F如果使用和文件适合一个屏幕,则不要输出终端初始化序列。 不幸的是,截至 2019 年,像 Debian 10 这样的一些发行版仍然使用旧版本的less,所以如果你不想从源构建它,唯一的解决方案是使用包装器。 这是这种包装器的一个示例。它的已知限制是a)和:n( :pnext/previous file) 命令less不起作用——命令行中的所有文件都连接在一个流中,并且b)它无法处理空字节在输入中,除非/usr/bin/awk实际上是gawk(GNU Awk) 或 Thomas Dickey 的mawk。 #! /usr/bin/awk -f BEGIN { "tput lines" | getline max; max -= 2 } { l[NR]=$0 } NR>=max { for(i = 1; i <= NR; i++) print l[i] | "less"; while(getline > 0) print | "less"; } END { if (NR < max) for(i = 1; i <= NR; i++) print l[i] | "less -FX" } Stéphane Chazelas 2018-09-07T06:03:04+08:002018-09-07T06:03:04+08:00 没有简单的方法解决这个问题。 要么让less使用备用屏幕保留原来的原始屏幕,要么不(使用-X)。 您真的不能指望less将屏幕恢复原样并在读取整页后开始使用备用屏幕。 less在以正确的模式开始并发送数据之前,我们需要以某种方式等到至少一页或 eof 已被读取。就像是: page_stdin() { awk -v l="${LINES:=$(tput lines)}" ' cmd {print | cmd; next} {lines = lines $0 ORS} NR == l {cmd = "less"; printf "%s", lines | cmd} END {if (!cmd) printf "%s", lines | "less -FX"}' } mypager() { if [ "$#" -eq 0 ]; then page_stdin else for file do page_stdin < "$file"; done fi } (使用 GNU ,如果一开始不存在尾随换行符awk,您可以替换ORS为不添加尾随换行符)。RT 但这意味着您不会开始看到管道命令的输出,cmd | mypager直到有一整页的价值或它完成输出。(例如,尝试seq 200 | pv -qL40 | mypager与 相比seq 200 | pv -qL40 | less)。 请注意,它假定您不使用类似的东西,LESS=-s并且会被比屏幕大的线条所愚弄,除非您有LESS=-S. Best Answer Luciano Andress Martini 2018-09-07T05:50:15+08:002018-09-07T05:50:15+08:00 将其粘贴到您的终端上(或将其放在 bashrc 上): less_cat(){ [ "$(wc -l <"$1")" -ge "$LINES" ] && less "$1" || less -FX "$1" } 现在您应该能够执行: less_cat /etc/fstab less_cat /var/log/messages 它会做你想做的事。 注意:此解决方案与 BASH/ZSH 兼容(请参阅评论) 好幸运!
如果我理解正确,您希望为大文件保留备用屏幕切换行为,并仅为适合单个屏幕且不需要滚动的小文件打开 -X 开关。
这现在是 530 版中的默认行为
less
;NEWS
从文件的源代码中引用:不幸的是,截至 2019 年,像 Debian 10 这样的一些发行版仍然使用旧版本的
less
,所以如果你不想从源构建它,唯一的解决方案是使用包装器。这是这种包装器的一个示例。它的已知限制是a)和
:n
(:p
next/previous file) 命令less
不起作用——命令行中的所有文件都连接在一个流中,并且b)它无法处理空字节在输入中,除非/usr/bin/awk
实际上是gawk
(GNU Awk) 或 Thomas Dickey 的mawk。没有简单的方法解决这个问题。
要么让
less
使用备用屏幕保留原来的原始屏幕,要么不(使用-X
)。您真的不能指望
less
将屏幕恢复原样并在读取整页后开始使用备用屏幕。less
在以正确的模式开始并发送数据之前,我们需要以某种方式等到至少一页或 eof 已被读取。就像是:(使用 GNU ,如果一开始不存在尾随换行符
awk
,您可以替换ORS
为不添加尾随换行符)。RT
但这意味着您不会开始看到管道命令的输出,
cmd | mypager
直到有一整页的价值或它完成输出。(例如,尝试seq 200 | pv -qL40 | mypager
与 相比seq 200 | pv -qL40 | less
)。请注意,它假定您不使用类似的东西,
LESS=-s
并且会被比屏幕大的线条所愚弄,除非您有LESS=-S
.将其粘贴到您的终端上(或将其放在 bashrc 上):
现在您应该能够执行:
它会做你想做的事。
注意:此解决方案与 BASH/ZSH 兼容(请参阅评论)
好幸运!