Оскільки менше 530 (випущено в грудні 2017 року), less --quit-if-one-screen
він не переходить на альтернативний екран, якщо він читає менше, ніж один екран. Таким чином, у вас не буде цієї проблеми, якщо ваша версія менше буде нещодавно нещодавнішою.
У попередніх версіях менше доводиться вирішувати, чи використовувати альтернативний екран під час його запуску. Ви не можете відкласти цей вибір, коли він закінчується.
Ви можете зателефонувати менше, дозвольте йому використовувати альтернативний екран і перенести вміст на основний екран, якщо менше закінчується автоматично. Однак я не знаю способу виявлення автоматичного припинення.
З іншого боку, не так складно викликати кішку для коротких входів і менше для великих входів, навіть зберігаючи буферизацію, щоб вам не довелося чекати, щоб весь вхід почав бачити менше матеріалів (буфер може бути трохи більше - ви нічого не побачите, доки не будете мати хоча б один скріншот даних - але не набагато більше).
#!/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