less 530(2017年12月にリリースされた)以降、less --quit-if-one-screen
1画面に満たない場合は代替画面に切り替えません。したがって、lessのバージョンが十分に新しい場合、この問題は発生しません。
以前のバージョンでは、起動時に代替画面を使用するかどうかを決定する必要はありません。終了するまでその選択を延期することはできません。
lessを呼び出して、代替画面を使用させ、lessが自動的に終了する場合は、コンテンツをプライマリ画面に表示できます。ただし、自動終了を検出する方法がわかりません。
一方、短い入力に対してcatを呼び出し、大きな入力に対してlessを呼び出すことはそれほど難しくありません。さらに、バッファリングを保持しているので、入力全体が少ないものを見るのを待つ必要はありません(バッファはわずかに大きく、少なくとも1画面分のデータが表示されるまで何も表示されませんが、それ以上は表示されません)。
#!/bin/sh
n=3 # number of screen lines that should remain visible in addition to the content
lines=
newline='
'
case $LINES in
''|*[!0-9]*) exec less;;
esac
while [ $n -lt $LINES ] && IFS= read -r line; do
lines="$lines$newline$line"
done
if [ $n -eq $LINES ]; then
{ printf %s "$lines"; exec cat; } | exec less
else
printf %s "$lines"
fi
メイン画面に表示される行を表示し、その行でスクロールが発生する場合は代替画面に切り替えることをお勧めします。
#!/bin/sh
n=3 # number of screen lines that should remain visible in addition to the content
beginning=
newline='
'
# If we can't determine the terminal height, execute less directly
[ -n "$LINES" ] || LINES=$(tput lines) 2>/dev/null
case $LINES in
''|*[!0-9]*) exec less "$@";;
esac
# Read and display enough lines to fill most of the terminal
while [ $n -lt $LINES ] && IFS= read -r line; do
beginning="$beginning$newline$line"
printf '%s\n' -- "$line"
n=$((n + 1))
done
# If the input is longer, run the pager
if [ $n -eq $LINES ]; then
{ printf %s "$beginning"; exec cat; } | exec less "$@"
fi