Desde menos 530 (lançado em dezembro de 2017), less --quit-if-one-screen
não alterna para a tela alternativa se ler menos de uma tela inteira. Então você não terá esse problema se a sua versão de menos for recente o suficiente.
Em versões anteriores, menos é necessário decidir se deve usar a tela alternativa quando ela for iniciada. Você não pode adiar essa escolha para quando terminar.
Você pode chamar menos, usar a tela alternativa e enviar o conteúdo para a tela principal, se menos terminar automaticamente. No entanto, não conheço uma maneira de detectar a terminação automática.
Por outro lado, não é tão difícil chamar o cat para entradas curtas e menos para entradas maiores, mesmo preservando o buffer para que você não precise esperar que toda a entrada comece a ver o material em menos (o O buffer pode ser um pouco maior - você não verá nada até que tenha pelo menos uma tela cheia de dados - mas não muito mais).
#!/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
Você pode preferir ver as linhas na tela principal conforme elas entram e alternar para a tela alternativa se as linhas causarem a rolagem.
#!/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