Заставить текст исчезать после ввода пользователем

поскольку версия 1:2012 больше не входит в stable (Jessie), перейдите на unstable (Sid), которая в настоящее время является версией 1:2016.2.22AR.1-3, как указано в сообщении об ошибке, на которое ссылается skilowatt.

9
16.08.2017, 21:03
3 ответа

Вы можете использовать:

tput cr

(или printf '\r'), чтобы переместить курсор в начало строки. Далее следует:

tput el

чтобы удалить все до конца строки.(tcshи zshтакже имеют встроенную функцию echotc, которую вы можете использовать с termcap, эквивалентной terminfoel:echotc ce(, а также echoti elв zsh))

.
12
27.01.2020, 20:04

Есть несколько способов сделать это, от идиотского до элегантного.

Самый надежный метод (хотя и наиболее работающий) — это возврат назад, пробел, повторение столько раз, сколько необходимо. Это работает на всем, кроме телетайпов (удаление чернил с бумаги — сложная задача).

Далее по шкале идет возврат каретки. Это не работает с эмуляторами терминала, которые вставляют перевод строки до или после каждого возврата каретки (это опция minicom и другие, которые могут быть настроены).

Затем есть специфические приемы терминала. Я упомяну только коды возможностей termcap, поскольку базы данных termcap и terminfo могут показать использование. (Вот список.)

Для одной строки просто перейти к столбцу (ch), а затем очистить до конца строки (ce).

Для более сложных случаев, включая многострочные ответы, есть сохранение абсолютной позиции (sc), подсказка, чтение ответа, восстановление позиции курсора (rc), очистка до конца экрана (cd).

В большинстве случаев вы можете жестко запрограммировать значения vt100 для последних двух ответов, так как большинство эмуляторов терминала совместимы с ним. Конечно, не все терминалы поддерживают эти параметры, но те, которые не поддерживаются, встречаются редко и устарели.

2
27.01.2020, 20:04

Используйте возврат каретки(\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        
14
27.01.2020, 20:04

Теги

Похожие вопросы