Tout d'abord, votre question n'a rien à voir avec bash mais avec le terminal. Le terminal répond pour afficher le texte des programmes et bash lui-même n'a aucun contrôle sur les programmes une fois lancés.
Les terminaux offrent des séquences de contrôle pour contrôler la couleur, la police, la position du curseur et plus encore. Pour une liste des séquences terminales standardisées, consultez
http://www.termsys.demon.co.uk/vtansi.htm Vous pouvez par exemple
- positionnez le curseur au début de la ligne
- supprimez la ligne après
- écrire une nouvelle ligne
pour créer une barre de progression.
Les séquences d'échappement de terminal plus avancées dépendent généralement du terminal, par exemple ne fonctionnent qu'avec Eterm ou xterm. ncurses - est une bibliothèque de programmation qui permet de créer des programmes interactifs avec le terminal afin que vous n'ayez pas à utiliser de séquences d'échappement.
Comment écraser une ligne existante avec des séquences de terminaux
echo long text
sleep 1
printf "\033[1A" # move cursor one line up
printf "\033[K" # delete till end of line
echo foo
Comment remplacer une ligne existante sans séquence de terminal
Une solution simple consiste à ne pas écrire une nouvelle ligne à la fin mais à écrire un retour chariot, qui réinitialise fondamentalement le curseur au début de la ligne, par exemple:
echo -n first
sleep 1
echo -ne "\rsecond"
echo
Le \r
retour chariot ou mettra le curseur au début de la ligne et vous permettra d'écraser le contenu de la ligne.
Basculer entre les tampons comme less
ouvi
Le comportement de less
est également dû à une fonctionnalité de terminal plus avancée, l'écran alternatif:
En mode VT102, il existe des séquences d'échappement pour activer et désactiver un tampon d'écran alternatif, de la même taille que la zone d'affichage de la fenêtre. Lorsqu'il est activé, l'écran actuel est enregistré et remplacé par l'écran alternatif. L'enregistrement des lignes défilant en haut de la fenêtre est désactivé jusqu'à ce que l'écran normal soit restauré. L'entrée term‐ cap (5) pour xterm permet à l'éditeur visuel vi (1) de passer à l'écran alternatif pour l'édition et de restaurer l'écran à la sortie. Une entrée de menu contextuel facilite le basculement entre les écrans normal et alterné pour couper et coller.
http://rosettacode.org/wiki/Terminal_control/Preserve_screen donne quelques exemples de la façon de le faire vous-même, soit via tput, soit via des séquences d'échappement.