530'dan az (Aralık 2017'de piyasaya sürüldü), less --quit-if-one-screen
bir perdeden az gösteriliyorsa alternatif ekrana geçmiyor. Yani daha az versiyonunuz yeterince yeni ise, bu problemi yaşamayacaksınız.
Önceki sürümlerde, daha az başladığında alternatif ekranın kullanılıp kullanılmayacağına karar vermek zorundadır. Bu seçimi sona erdiğinde erteleyemezsiniz.
Daha az arayabilir, alternatif ekranı kullanmasına izin verebilir ve daha az otomatik olarak sonlanırsa içeriği birincil ekrana getirebilirsiniz. Ancak otomatik sonlandırmayı tespit etmenin bir yolunu bilmiyorum.
Öte yandan, kısa girişler için kedi çağrısı yapmak zor değildir ve daha büyük girişler için daha az giriş, hatta tamponlamayı koruyarak bile tüm girişin daha az şey görmeye başlamasını beklemeniz gerekmez (arabellek biraz daha büyük - en az bir ekran bilgisine sahip olana kadar hiçbir şey göremezsiniz - ama çok fazla değil).
#!/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
Satırları ana ekranda göründükleri gibi görmeyi ve satırlar kaydırmaya neden olacaksa alternatif ekrana geçmeyi tercih edebilirsiniz.
#!/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