Kullanıcı girdikten sonra metnin kaybolmasını sağlayın


9

Görüntülenen içeriği kullanıcı giriş yaptıktan hemen sonra yok etmenin bir yolu var mı?

Örneğin, bu dosyayı aşağıya alın

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

Bunu çalıştırırsanız, çıktı

how are you ? yHave fun

how are you ?Kullanıcı bir tuşa basar basmaz kaybolmama izin veren bir şey arıyorum

Ve sonra kaybolduktan sonra, Have fun

Yani, yukarıdaki programın son çıktısının sadece

Have fun

Not: Ayrıca, kabuk ekranına yazdırılan bu komut dosyasının üzerindeki hiçbir şey silinmemelidir.

Ben kullanıyorum bash


2
s cleararasında kullanma echoseçeneği yok?
sebasth

1
Hayır, clearönceden ekranda yazdırılmış olan çıktıyı varsa temizler. @sebasth
ÇingeneCosmonaut

Nereden Are you finegeliyor? Olmamalı mı How are you?
Barmar

@Barmar evet, üzgünüm bu yanlışlıkla, düzeltildi
GypsyCosmonaut

Yanıtlar:


12

Kullanabilirsiniz:

tput cr

(veya printf '\r') imleci satırın başına götür. Bunu takiben:

tput el

satır sonuna kadar her şeyi silmek için. ( tcshVe zshaynı zamanda var echotcsen kullanabileceğiniz yerleşiğini termcapbunun eşdeğeri terminfo el: echotc ce(aynı zamanda echoti eliçinde zsh))


14

Bir satır başı ( \r) kullanın . Bu özel karakter (mekanik daktilo günlerinden kalanlar) imleci satırın başına götürecektir. Ardından, silmek istediğiniz mesaj kadar boşluk gerekir (bu mesajın üzerine yazılır) ve ardından sonraki mesajı yazdırmadan önce ikinci bir satır başı geri döner. Bunun gibi bir şey:

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

Yukarıdaki komut dosyasını çalıştırmak yazdırır:

$ foo.sh
foo
Have fun        

1
Bunun yerine iki \rsen arasındaki tüm boşlukları koyabilirsiniz \rHave funve \n.
Barmar

2

Bunu yapmak için aptal kanıtıdan zarifliğe kadar çeşitli yollar var.

En kusursuz yöntem (her ne kadar en çok iş olsa da), çoğu kez tekrarlanan geri alan uzay geri alanıdır. Bu, teletipler dışında her şeyde işe yarar (mürekkebi kağıttan çıkarmak zor bir iştir).

Daha sonra ölçek, taşıma dönüş boşlukları taşıma dönüşüdür. Bu, her satır başlangıcından önce veya sonra satır besleme yerleştiren terminal öykünücülerle çalışmaz (bu bir minicom seçeneğidir ve diğerleri sahip olacak şekilde yapılandırılmış olabilir).

Daha sonra termcap ve terminfo veritabanlarının kullanımı gösterebileceği için sadece termcap yetenek kodlarından bahsedeceğim terminale özel hileler var. (İşte bir liste.)

Tek bir satır için basit olan sütun (ch) ve ardından satır (ce) sonuna kadar hareket etmektir.

Çok satırlı yanıtlar da dahil olmak üzere daha karmaşık durumlarda, mutlak konum (sc), komut istemi, okuma yanıtı, imleç konumunu geri yükle (rc), ekranın sonuna kadar temizler (cd).

Çoğu durumda, çoğu terminal öykünücüsü onunla uyumlu olduğu için son iki cevap için vt100 değerlerini sabit kodlayabilirsiniz. Elbette tüm terminaller bu seçenekleri desteklemez, ancak nadir ve eski olmayanları destekler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.