Вы можете использовать:
tput cr
(или printf '\r'
), чтобы переместить курсор в начало строки. Далее следует:
tput el
чтобы удалить все до конца строки.(tcsh
и zsh
также имеют встроенную функцию echotc
, которую вы можете использовать с termcap
, эквивалентной terminfo
el
:echotc ce
(, а также echoti el
в zsh
))
Есть несколько способов сделать это, от идиотского до элегантного.
Самый надежный метод (хотя и наиболее работающий) — это возврат назад, пробел, повторение столько раз, сколько необходимо. Это работает на всем, кроме телетайпов (удаление чернил с бумаги — сложная задача).
Далее по шкале идет возврат каретки. Это не работает с эмуляторами терминала, которые вставляют перевод строки до или после каждого возврата каретки (это опция minicom и другие, которые могут быть настроены).
Затем есть специфические приемы терминала. Я упомяну только коды возможностей termcap, поскольку базы данных termcap и terminfo могут показать использование. (Вот список.)
Для одной строки просто перейти к столбцу (ch), а затем очистить до конца строки (ce).
Для более сложных случаев, включая многострочные ответы, есть сохранение абсолютной позиции (sc), подсказка, чтение ответа, восстановление позиции курсора (rc), очистка до конца экрана (cd).
В большинстве случаев вы можете жестко запрограммировать значения vt100 для последних двух ответов, так как большинство эмуляторов терминала совместимы с ним. Конечно, не все терминалы поддерживают эти параметры, но те, которые не поддерживаются, встречаются редко и устарели.
Используйте возврат каретки(\r
). Этот специальный символ (, оставшийся со времен механических пишущих машинок ), перемещает курсор обратно в начало строки. Затем вам нужно столько пробелов, сколько сообщение, которое вы хотите удалить (, это перезапишет сообщение ), а затем второй возврат каретки, чтобы вернуться к началу перед печатью следующего сообщения. Примерно так:
#!/bin/bash
echo foo
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
printf '\r \rHave fun\n'
else
printf '\r \rGo to Doctor\n'
fi
Запуск скрипта выше распечатывает:
$ foo.sh
foo
Have fun