Сделать текст исчезнет после ввода пользователя

9

Есть ли способ сделать так, чтобы отображаемый контент исчезал сразу после ввода данных пользователем?

Например, возьмите этот файл ниже

#!/bin/bash
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    echo 'Have fun'
else
    echo 'Go to Doctor'
fi

Если вы запустите это, вывод

how are you ? yHave fun

Я ищу что-то, что позволяет мне how are you ?исчезнуть, как только пользователь нажимает клавишу

А затем после исчезновения распечатать Have fun

Итак, я хочу, чтобы последний вывод вышеуказанной программы был только

Have fun

Примечание. Кроме того, все, что находится над этим сценарием и напечатано на экране оболочки, стирать не следует.

я использую bash

GypsyCosmonaut
источник
2
используя clearмежду echoS не вариант?
Себастьян
1
Нет, clearочистит вывод, который уже напечатан выше на экране, если таковой имеется. @sebasth
GypsyCosmonaut
Откуда Are you fineберутся? Не должно ли это быть How are you?
Бармар
@ Barmar да, извините, это по ошибке, исправлено сейчас
GypsyCosmonaut

Ответы:

12

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

tput cr

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

tput el

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

Стефан Шазелас
источник
14

Используйте возврат каретки ( \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        
Тердон
источник
1
Вместо двух \rвы можете поставить все пробелы между \rHave funи \n.
Бармар
2

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

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

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

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

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

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

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

hildred
источник