Зробити текст зникнути після введення користувачем


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


2
використання clearміж echos не варіант?
sebasth

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 та terminfo можуть показувати використання. (Ось список.)

Простим для одного рядка є переміщення до стовпця (ch) з подальшим чітким до кінця рядка (ce).

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

У більшості випадків ви можете жорстко кодувати значення vt100 за останні два відповіді, оскільки більшість термінальних емуляторів сумісні з ним. Звичайно, не всі термінали підтримують ці варіанти, але ті, які не є рідкісними та застарілими.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.