Não há maneira fácil de contornar isso.
Ou deixe que less
use a tela alternativa para deixar o original original ou não (use -X
).
Você não pode esperar que less
restaure a tela como estava e comece a usar a tela alternativa depois de ler uma página inteira.
Precisamos de alguma forma esperar até que pelo menos uma página ou e-mail tenha sido lido antes de iniciar less
no modo correto e enviar os dados. Algo como:
page_stdin() {
awk -v l="${LINES:=$(tput lines)}" '
cmd {print | cmd; next}
{lines = lines $0 ORS}
NR == l {cmd = "less"; printf "%s", lines | cmd}
END {if (!cmd) printf "%s", lines | "less -FX"}'
}
mypager() {
if [ "$#" -eq 0 ]; then
page_stdin
else
for file do page_stdin < "$file"; done
fi
}
(com GNU awk
, você pode substituir ORS
por RT
para não adicionar uma nova linha se não estivesse lá).
Mas isso significa que você não começará a ver a saída do comando canalizado em cmd | mypager
até que haja uma página inteira no valor dela ou tenha terminado a saída. (tente por exemplo seq 200 | pv -qL40 | mypager
comparado a seq 200 | pv -qL40 | less
).
Observe que você não usa itens como LESS=-s
e seria enganado por linhas maiores que a tela, a menos que você tenha LESS=-S
.