当我通过管道将某些内容输入less --quit-if-one-screen +G
(alias -F +G
) 时,如果输出超出终端大小,则 less 打开并滚动到末尾。
不幸的是,它在关闭之前也会滚动到末尾,并占据整个终端屏幕,看起来像这样(如果终端有 6 行):
❯ echo hi | less --quit-if-one-screen +G
~
~
~
~
~
hi
有没有办法防止这种情况,即如果输入少于一页,则保持输入不变,但如果少于一页,则滚动到末尾。
答案1
我认为唯一的方法是根据您传递的内容使用单独的命令。
首先,为了方便演示,我将创建两个变量,一个包含 4 行文本,另一个包含 20 行文本。
SmallVar=$(cat <<EOF
01 SmallVar
02 A
03 B
04 C
EOF
)
LargeVar=$(cat <<EOF
01 LargeVar
02 A
03 B
04 C
05 D
06 E
07 F
08 G
09 H
10 I
11 J
12 K
13 L
14 M
15 N
16 O
17 P
18 Q
19 R
20 S
EOF
)
echo
echo "Lines in SmallVar: $(echo "${SmallVar}" | wc -l)"
echo "Lines in LargeVar: $(echo "${LargeVar}" | wc -l)"
echo "Lines available in terminal: $(tput lines)"
echo
上面的输出是:
Lines in SmallVar: 4
Lines in LargeVar: 20
Lines available in terminal: 15
这些都在一行上,但可以分成多行以便于阅读。tmpVar
是您传递的变量或文件内容。 (如果您要传递文件内容,则可以使用tmpVar="$(cat filename.txt"
)
候选名单
tmpVar="${SmallVar}"; if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ]; then echo "${tmpVar}" | less -FX; else echo "${tmpVar}" | less +G -FX; fi;
长名单
tmpVar="${LargeVar}"; if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ]; then echo "${tmpVar}" | less -FX; else echo "${tmpVar}" | less +G -FX; fi;
将其分成单独的行可能更容易阅读:
tmpVar="${SmallVar}";
#tmpVar="${LargeVar}";
if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ];
then
echo "${tmpVar}" | less -FX;
else
echo "${tmpVar}" | less +G -FX;
fi;
首先,它会将if
变量中的行数与终端中的行数进行比较(tput lines
自行运行,调整窗口大小并再次运行)。如果等于或小于,则忽略+G
.否则,它将使用+G
.用于-X
在退出后将值保留在屏幕上。当您按q退出时,它会保留屏幕上的最后几行而不清除它们。
比较
$ tmpVar="${SmallVar}"; if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ]; then echo "${tmpVar}" | less -FX; else echo "${tmpVar}" | less +G -FX; fi;
01 SmallVar
02 A
03 B
04 C
$
和
$ tmpVar="${LargeVar}"; if [ $(echo "${tmpVar}" | wc -l) -le $(tput lines) ]; then echo "${tmpVar}" | less -FX; else echo "${tmpVar}" | less +G -FX; fi;
...........[scroll]...........
07 F
08 G
09 H
10 I
11 J
12 K
13 L
14 M
15 N
16 O
17 P
18 Q
19 R
20 S
(END)