Menghilangkan teks setelah input pengguna

9

Apakah ada cara Anda dapat membuat konten yang ditampilkan menghilang setelah pengguna memberikan input?

Misalnya, ambil file ini di bawah

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

Jika Anda menjalankan ini, hasilnya adalah

how are you ? yHave fun

Saya mencari sesuatu yang membuat saya how are you ?menghilang segera setelah pengguna menekan tombol

Dan kemudian setelah menghilang, cetak Have fun

Jadi, saya ingin keluaran terakhir dari program di atas hanya

Have fun

Catatan: Juga, apa pun di atas skrip ini yang dicetak pada layar shell tidak boleh dihapus.

saya menggunakan bash

GypsyCosmonaut
sumber
2
menggunakan cleardi antara echos bukan pilihan?
sebasth
1
Tidak, clearakan menghapus output yang sudah dicetak di atas pada layar jika ada. @sebasth
GypsyCosmonaut
Dari mana datangnya Are you fine? Bukankah seharusnya begitu How are you?
Barmar
@Barmar ya, maaf itu karena kesalahan, diperbaiki sekarang
GypsyCosmonaut

Jawaban:

12

Kamu bisa menggunakan:

tput cr

(atau printf '\r') untuk memindahkan kursor ke awal baris. Diikuti oleh:

tput el

untuk menghapus semuanya hingga akhir baris. ( tcshdan zshjuga memiliki echotcbuiltin yang dapat Anda gunakan dengan yang termcapsetara dengan itu terminfo el: echotc ce(juga echoti eldalam zsh)

Stéphane Chazelas
sumber
14

Gunakan carriage return ( \r). Karakter khusus ini (sisa dari zaman mesin tik mekanis) akan memindahkan kursor kembali ke awal baris. Kemudian, Anda membutuhkan ruang sebanyak pesan yang ingin Anda hapus (ini akan menimpa pesan) dan kemudian carriage kedua kembali untuk kembali ke awal sebelum mencetak pesan berikutnya. Sesuatu seperti ini:

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

Menjalankan skrip di atas cetakan:

$ foo.sh
foo
Have fun        
terdon
sumber
1
Alih-alih dua \rAnda bisa menempatkan semua ruang antara \rHave fundan \n.
Barmar
2

Ada beberapa cara untuk melakukan ini, mulai dari bukti idiot hingga elegan.

Metode yang paling mudah (meskipun yang paling berhasil) adalah ruang backspace backspace diulang namun berkali-kali dibutuhkan. Ini berfungsi pada semua hal kecuali teletype (menghilangkan tinta dari kertas adalah suatu tantangan).

Selanjutnya skala adalah carriage return spasi carriage return. Ini tidak berfungsi dengan emulator terminal yang menyisipkan umpan baris sebelum atau setelah setiap carriage return (ini adalah minicom pilihan dan yang lain mungkin dikonfigurasi untuk dimiliki).

Lalu ada trik khusus terminal saya akan menyebutkan hanya kode kapabilitas termcap sebagai termcap dan database terminfo dapat menunjukkan penggunaan. (Ini daftar.)

Sederhana untuk satu baris adalah pindah ke kolom (ch) diikuti oleh clear to end of line (ce).

Untuk kasus-kasus yang lebih rumit termasuk respons multi-jalur, ada save absolute position (sc), prompt, read response, restore position cursor (rc), hapus ke ujung layar (cd).

Dalam kebanyakan kasus, Anda dapat meng-hardcode nilai vt100 untuk dua jawaban terakhir karena sebagian besar emulator terminal kompatibel dengannya. Tentu saja tidak semua terminal mendukung opsi-opsi itu, tetapi terminal yang tidak jarang dan usang.

Hildred
sumber