Desde menos 530 (lançado em dezembro de 2017), less --quit-if-one-screen
não muda para a tela alternativa se ler menos de uma tela. Portanto, você não terá esse problema se sua versão do less for recente o suficiente.
Nas versões anteriores, menos precisa decidir se deve usar a tela alternativa quando é iniciada. Você não pode adiar essa opção para quando ela terminar.
Você poderia ligar menos, deixá-lo usar a tela alternativa e colocar o conteúdo na tela principal se menos terminar automaticamente. No entanto, não conheço uma maneira de detectar o encerramento automático.
Por outro lado, não é tão difícil chamar 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 as coisas em menos (o buffer pode ser um pouco maior - você não verá nada até ter 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 quando elas entram e alternar para a tela alternativa se as linhas causarem 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