Prima di tutto la tua domanda non ha nulla a che fare con bash ma con il terminale. Il terminale sta rispondendo per visualizzare il testo dei programmi e bash stesso non ha alcun controllo sui programmi una volta lanciato.
I terminali offrono sequenze di controllo per controllare colore, font, posizione del cursore e altro. Per un elenco di sequenze di terminali standardizzate, consultare
http://www.termsys.demon.co.uk/vtansi.htm Ad esempio è possibile
- posiziona il cursore all'inizio della riga
- eliminare la riga in seguito
- scrivi una nuova riga
per creare una barra di avanzamento.
Le sequenze di escape del terminale più avanzate dipendono in genere dal terminale, ad esempio funzionano solo con Eterm o xterm. ncurses - è una libreria di programmazione che consente di creare programmi interattivi con il terminale in modo da non dover utilizzare sequenze di escape.
Come sovrascrivere una linea esistente con sequenze di terminali
echo long text
sleep 1
printf "\033[1A" # move cursor one line up
printf "\033[K" # delete till end of line
echo foo
Come sovrascrivere una linea esistente senza sequenza terminale
Una soluzione semplice è quella di non scrivere una riga alla fine ma di scrivere il ritorno a capo, che in pratica reimposta il cursore all'inizio della riga, ad esempio:
echo -n first
sleep 1
echo -ne "\rsecond"
echo
Il \r
ritorno a capo o posiziona il cursore all'inizio della riga e consente di sovrascrivere il contenuto della riga.
Passa da un buffer all'altro come less
ovi
Il comportamento di less
è anche dovuto a una funzionalità terminale più avanzata, la schermata alternativa:
Nella modalità VT102, ci sono sequenze di escape per attivare e disattivare un buffer dello schermo alternativo, che ha le stesse dimensioni dell'area di visualizzazione della finestra. Se attivata, la schermata corrente viene salvata e sostituita con la schermata alternativa. Il salvataggio delle linee fatte scorrere dalla parte superiore della finestra è disabilitato fino a quando non viene ripristinata la schermata normale. La voce term-cap (5) per xterm consente all'editor visivo vi (1) di passare alla schermata alternativa per la modifica e ripristinare la schermata all'uscita. Una voce di menu popup semplifica il passaggio tra le schermate normali e alternative per taglia e incolla.
http://rosettacode.org/wiki/Terminal_control/Preserve_screen elenca alcuni esempi su come farlo da soli, tramite tput o tramite alcune sequenze di escape.