무언가를 파이프로 연결 less --quit-if-one-screen +G
(별칭 -F +G
)할 때 출력이 터미널 크기를 초과하면 덜 열리고 끝까지 스크롤됩니다.
불행하게도 닫기 전에 끝까지 스크롤하여 전체 터미널 화면을 차지합니다. 다음과 같습니다(터미널에 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)