Ponieważ mniej 530 (wydanych w grudniu 2017 r.), less --quit-if-one-screen
Nie przełącza się na alternatywny ekran, jeśli odczytuje mniej niż jeden ekran. Więc nie będziesz mieć tego problemu, jeśli twoja wersja less jest wystarczająco aktualna.
We wcześniejszych wersjach mniej musi decydować, czy użyć alternatywnego ekranu podczas uruchamiania. Nie możesz odroczyć tego wyboru do momentu, w którym wygasa.
Możesz zadzwonić mniej, pozwolić użyć alternatywnego ekranu i przenieść zawartość na ekran główny, jeśli less kończy się automatycznie. Jednak nie znam sposobu na wykrycie automatycznego zakończenia.
Z drugiej strony, nie jest tak trudno wywołać cat dla krótkich danych wejściowych, a mniej dla większych danych wejściowych, nawet zachowując buforowanie, dzięki czemu nie musisz czekać, aż całe dane wejściowe zaczną widzieć mniej (bufor może być nieco większy - nic nie zobaczysz, dopóki nie będziesz mieć przynajmniej jednego ekranu danych - ale niewiele więcej).
#!/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
Możesz zobaczyć linie na ekranie głównym, gdy się pojawią, i przełącz się na ekran alternatywny, jeśli linie spowodują przewijanie.
#!/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