Yeni bir hat yazmanın tersine, terminaldeki bir hattın içeriği nasıl değiştirilir?


24

Böylece, wgetbir web sayfası görüntülendiğinde, dosyaların / dosyaların ne kadar indirildiğini belirten bir durum çubuğu gösterir. Bu gibi görünüyor:

25%[=============>______________________________________] 25,000 100.0K/s (alt çizgiler boşluktur; orada birden fazla ardışık boşluğun nasıl elde edilebileceğini çözemedim)

Ancak, stdout'a başka bir satır yazmak ve başka bir ilerleme çubuğu eklemek yerine, bunu şöyle günceller:

50%[===========================>________________________] 50,000 100.0K/s

Ve wgetbunun da tek örneği değil. Örneğin, bir şeyi içine lesssokup çıktıktan sonra, asıl isteminiz daha önce koştuğunuz komutların sonucuyla birlikte hala oradadır. Hiç gitmemiş gibisin.

Öyleyse, benim sorularım, buna ne denir, nasıl uygularım, bir seferde sadece tek bir satır için çalışır mı ve bunu C'de kullanabilir miyim?


5
BashFAQ 44 okumanızı tavsiye ederim . Bunu ilginç bulabilirsiniz.
jw013

Yanıtlar:


32

Öncelikle sorunuzun bash ile ilgisi yok, terminal ile ilgisi var. Terminal, programların metnini görüntülemek için yanıt veriyor ve bash başlatıldıktan sonra programlar üzerinde hiçbir kontrol sahibi değil.

Terminaller, rengi, yazı tipini, imleç konumunu ve daha fazlasını kontrol etmek için kontrol sekansları sunar. Standart hale getirilmiş terminal dizilerinin bir listesi için http://www.termsys.demon.co.uk/vtansi.htm adresine bakınız. Örneğin

  • imleci satırın başına getir
  • sonradan satırı sil
  • yeni bir satır yaz

bir ilerleme çubuğu oluşturmak için.

Daha gelişmiş terminal kaçış dizileri tipik olarak terminale bağlıdır, örneğin sadece Eterm veya xterm ile çalışır. ncurses - terminal ile etkileşimli programlar yaratan bir programlama kütüphanesidir, bu nedenle kaçış dizilerini kullanmak zorunda kalmazsınız.

Terminal dizileri ile mevcut bir hattın üzerine yazma

echo long text
sleep 1
printf "\033[1A"  # move cursor one line up
printf "\033[K"   # delete till end of line
echo foo

Terminal sırası olmayan mevcut bir hattın üzerine yazma

Basit bir çözüm, sonunda yeni bir satır yazmak değil, imleci temelde satırın başına ayarlayan satır başı yazmaktır, örneğin:

echo -n first 
sleep 1 
echo -ne "\rsecond"
echo

\rVeya satır başı satırın başında imleci koymak ve hattın içeriğin üzerine sağlar olacaktır.

lessVeya gibi tamponlar arasında geçiş yapvi

Davranışı less, alternatif ekranın daha gelişmiş bir terminal özelliği nedeniyle de ortaya çıkar:

VT102 modunda, pencerenin gösterim alanıyla aynı boyutta olan alternatif bir ekran tamponunu etkinleştirmek ve devre dışı bırakmak için kaçış dizileri vardır. Etkinleştirildiğinde, geçerli ekran kaydedilir ve alternatif ekranla değiştirilir. Kaydırılan çizgilerin kaydedilmesi, normal ekran geri yüklenene kadar pencerenin üst kısmından çıkar. Xterm için ‐ cap (5) girişi, görsel düzenleyicinin vi (1) düzenleme için alternatif ekrana geçmesini ve çıkışta ekranı geri yüklemesini sağlar. Bir açılır menü girişi, kesme ve yapıştırma için normal ve alternatif ekranlar arasında geçiş yapmayı kolaylaştırır.

http://rosettacode.org/wiki/Terminal_control/Preserve_screen , tput veya bazı kaçış dizileriyle nasıl yapılacağını gösteren bazı örnekleri listeler .


15

echoDizeye otomatik olarak yeni bir satır ekleyen kullanmak yerine , use printf "%s\r" whatever- satır başı, imleci geçerli satırın başına gönderir. örnek:

seq 1 15 | while read num; do printf "%2d\r" $num; sleep 1; done; echo ""

Terminalinizin imlecine bağlı olarak, yapmak daha zevkli olabilirprintf "\r%2d " $num
glenn jackman
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.