Spraw, aby tekst znikał po wprowadzeniu przez użytkownika

9

Czy istnieje sposób, aby sprawić, że wyświetlana zawartość zniknie zaraz po tym, jak użytkownik wyrazi zgodę?

Na przykład weź ten plik poniżej

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

Jeśli to uruchomisz, wynikiem będzie

how are you ? yHave fun

Szukam czegoś, co pozwoli mi how are you ?zniknąć, gdy tylko użytkownik naciśnie klawisz

A potem po zniknięciu wydrukuj Have fun

Chcę, aby ostatnie wyjście powyższego programu było tylko

Have fun

Uwaga: Nie należy również usuwać niczego powyżej tego skryptu, które jest drukowane na ekranie powłoki.

ja używam bash

Cyganka Kosmonauta
źródło
2
używanie clearpomiędzy echonie jest opcją?
sebasth
1
Nie, clearwyczyści wydruk, który jest już wydrukowany powyżej na ekranie, jeśli taki istnieje. @sebasth
GypsyCosmonaut
Skąd Are you finepochodzi? Czy nie powinno tak być How are you?
Barmar
@Barmar tak, przepraszam, że to przez pomyłkę, teraz poprawione
GypsyCosmonaut

Odpowiedzi:

12

Możesz użyć:

tput cr

(lub printf '\r'), aby przesunąć kursor na początek linii. Śledzony przez:

tput el

aby usunąć wszystko do końca linii. ( tcsha zshtakże mieć echotcwbudowane narzędzie, którego można używać z termcapodpowiednikiem tego terminfo el: echotc ce(również echoti elw zsh)

Stéphane Chazelas
źródło
14

Użyj znaku powrotu karetki ( \r). Ten znak specjalny (pozostałość po czasach pisania maszyn do pisania) przeniesie kursor z powrotem na początek linii. Następnie potrzebujesz tyle spacji, ile wiadomość chcesz usunąć (spowoduje to nadpisanie wiadomości), a następnie drugi powrót karetki, aby wrócić do początku przed wydrukowaniem następnej wiadomości. Coś takiego:

#!/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

Uruchomienie powyższego skryptu:

$ foo.sh
foo
Have fun        
terdon
źródło
1
Zamiast dwóch \rmożesz wstawić wszystkie spacje między \rHave funi \n.
Barmar
2

Można to zrobić na wiele sposobów, od idiotyzującego po elegancki.

Najbardziej niezawodną metodą (choć najbardziej pracującą) jest powtarzanie backspace, jednak tyle razy potrzeba. Działa to na wszystkich rodzajach oprócz teletypów (usuwanie atramentu z papieru to wyzwanie).

Następnie w górę skali znajdują się spacje powrotu karetki. Nie działa to w przypadku emulatorów terminali, które wstawiają wysuw linii przed lub po każdym powrocie karetki (jest to opcja minicom, a inne mogą być skonfigurowane tak).

Następnie są sztuczki specyficzne dla terminala, o których wspomnę tylko kody możliwości termcap, ponieważ bazy danych termcap i terminfo mogą pokazywać użycie. (Oto lista.)

Proste dla pojedynczej linii jest przejście do kolumny (ch), a następnie usunięcie do końca linii (ce).

W przypadku bardziej skomplikowanych przypadków, w tym odpowiedzi wieloliniowych, zapisano pozycję bezwzględną (sc), monit, odpowiedź odczytu, przywróć pozycję kursora (rc), wyczyść do końca ekranu (cd).

W większości przypadków można zakodować wartości vt100 dla dwóch ostatnich odpowiedzi, ponieważ większość emulatorów terminali jest z nim zgodna. Oczywiście nie wszystkie terminale obsługują te opcje, ale te, które nie są rzadkie i przestarzałe.

Hildred
źródło