Перш за все, ваше запитання не має нічого спільного з bash, а не з терміналом. Термінал відповідає на показ тексту програм і сам bash не має контролю над програмами після їх запуску.
Термінали пропонують контрольні послідовності для управління кольором, шрифтом, положенням курсору тощо. Для переліку стандартизованих послідовностей терміналів ознайомтеся з
http://www.termsys.demon.co.uk/vtansi.htm Ви можете, наприклад,
- розташуйте курсор на початку рядка
- видаліть рядок після цього
- написати новий рядок
щоб створити панель прогресу.
Більш просунуті послідовності відключення терміналу, як правило, залежать від терміналу, наприклад, працюйте лише з Eterm або xterm. ncurses - це бібліотека програмування, яка створює інтерактивні програми з терміналом, тому вам не доведеться використовувати послідовності втечі.
Як перезаписати існуючий рядок із термінальними послідовностями
echo long text
sleep 1
printf "\033[1A" # move cursor one line up
printf "\033[K" # delete till end of line
echo foo
Як перезаписати існуючий рядок без термінальної послідовності
Одне просте рішення - не писати новий рядок в кінці, а записати повернення каретки, яке в основному скидає курсор на початок рядка, наприклад:
echo -n first
sleep 1
echo -ne "\rsecond"
echo
\r
Або повернення каретки буде помістити курсор на початок рядка і дозволяє перезаписати вміст рядка.
Перемикайтеся між буферами, як less
абоvi
Поведінка less
також обумовлена вдосконаленою функцією терміналу, альтернативним екраном:
У режимі VT102 є послідовності відключення для активації та дезактивації альтернативного буфера екрана, який має той же розмір, що і область відображення вікна. Після активації поточний екран зберігається та замінюється альтернативним екраном. Збереження рядків, прокручених у верхній частині вікна, вимкнено, поки нормальний екран не відновиться. Запис терміна cap (5) для xterm дозволяє візуальному редактору vi (1) перейти на альтернативний екран для редагування та відновити екран при виході. Запис меню, що вискакує, спрощує переключення між звичайним та альтернативним екранами для вирізання та вставки.
http://rosettacode.org/wiki/Terminal_control/Preserve_screen перераховує приклад того, як зробити це самостійно, або через tput, або через деякі послідовності втечі.