Dado que menos de 530 (lanzado en diciembre de 2017), less --quit-if-one-screen
no cambia a la pantalla alternativa si lee menos de una pantalla completa. Por lo tanto, no tendrá este problema si su versión de less es lo suficientemente reciente.
En versiones anteriores, menos tiene que decidir si usar la pantalla alternativa cuando se inicia. No puede diferir esa elección cuando termine.
Podría llamar menos, dejar que use la pantalla alternativa y colocar el contenido en la pantalla principal si menos termina automáticamente. Sin embargo, no conozco una forma de detectar la terminación automática.
Por otro lado, no es tan difícil llamar a cat para entradas cortas y menos para entradas más grandes, incluso preservando el almacenamiento en búfer para que no tenga que esperar a que toda la entrada comience a ver cosas en menos (el búfer puede ser un poco más grande, no verá nada hasta que tenga al menos una pantalla llena de datos, pero no mucho más).
#!/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
Es posible que prefiera ver las líneas en la pantalla principal a medida que entran y cambiar a la pantalla alternativa si las líneas causan desplazamiento.
#!/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