Aynı satırda yankı nasıl gösterilir ve güncellenir


112

Bash'de aşağıdakilere sahibim (Linux'ta)

for dir in Movies/*
do
  (cd "$dir" && pwd|cut -d \/ -f5|tr -s '\n' ', ' >> ../../movielist &&
  exiftool * -t -s3 -ImageSize -FileType|tr -s '\t' ',' >> ../../movielist )
echo "Movie $movies - $dir ADDED!"
let movies=movies+1
done

Ama bunu, "echo" nun bir sonraki satırda aşağıdaki yankıyı göstermesini istiyorum (Son yankı çıktısı ile bitiştirmeyin ama değiştirin), böylece güncelleniyor gibi görünmesini sağlayın. Yüzde olan bir ilerleme çubuğunun aynı satırda gösterilmesine benzer.

Yanıtlar:


196

Peki bunun için man echosayfayı doğru okumadım .

echo'nun 3. kaçış karakteri eklersem bunu yapabilecek 2 seçeneği vardı.

2 seçenek -nve -e.

-nson satır satırsonu çıktılamaz. Bu da beni her bir şeyi yinelediğimde yeni bir satıra gitmekten kurtarıyor.

-e ters eğik çizgi kaçış sembollerini yorumlamama izin verecek.

Bunun için kullanmak istediğiniz kaçış sembolü Tahmin: \r. Evet, satır başı dönüşü beni başlangıca geri gönderecek ve görsel olarak aynı satırda güncelleme yapıyormuşum gibi görünecek.

Böylece yankı çizgisi şöyle görünür:

echo -ne "Movie $movies - $dir ADDED!"\\r

Bash'in onu öldürmemesi için kaçış sembolünden kaçmalıydım. bu yüzden 2 görüyorsun\ orada sembol .

William'ın bahsettiği printfgibi, bunun gibi benzer (ve daha kapsamlı) görevleri de yapabilir.


12
Gelecek için bir not: printf hiçbir seçenek olmadan tamamen aynı şeyi yapacaktır. Bunun avantajı, printf'in genellikle her ortamda ve işletim sisteminde benzer şekilde davranması ve echo'nun bazen çok farklı davranabilmesidir. Çapraz platform komut dosyaları için (veya bunu umursayabileceğinizi düşünüyorsanız), printf kullanmak en iyi uygulamadır.
William T Froggard

8
printf a; printf bçıktılar ab--- printf a\\r; printf bçıktılar b--- printf a\\r; sleep 1; printf bçıktılar a, sonrab
XavierStuvw

64

İyi anladıysam, yankınızı aşağıdaki satırla değiştirebilirsin:

echo -ne "Movie $movies - $dir ADDED! \033[0K\r"

İşte davranışını anlamak için çalıştırabileceğiniz küçük bir örnek:

#!/bin/bash
for pc in $(seq 1 100); do
    echo -ne "$pc%\033[0K\r"
    sleep 1
done
echo

Görünüşe göre K
zsh'da

1
Harika bir örnek - benim için başlangıçtaki hash bang anahtardı
Felix Eve

23

Cevapların geri kalanı oldukça iyi, ancak birisinin çok satırlı bir yankıyı değiştirmek / güncellemek için bir çözüm aramaya gelmesi durumunda bazı ekstra bilgiler eklemek istedim.

Bu yüzden hepinizle bir örnek paylaşmak istiyorum. Aşağıdaki komut dosyası bir CentOS sisteminde denendi ve temelde sisteminizin bazı ayrıntılı zaman bilgilerini yazdıran "timedatectl" komutunu kullanır.

Çıktısı birden çok satır içerdiğinden ve aşağıdaki örnek için mükemmel çalıştığından bu komutu kullanmaya karar verdim:

#!/bin/bash
while true; do
  COMMAND=$(timedatectl) #Save command result in a var.
  echo "$COMMAND" #Print command result, including new lines.

  sleep 3 #Keep above's output on screen during 3 seconds before clearing it

  #Following code clears previously printed lines
  LINES=$(echo "$COMMAND" | wc -l) #Calculate number of lines for the output previously printed
  for (( i=1; i <= $(($LINES)); i++ ));do #For each line printed as a result of "timedatectl"
    tput cuu1 #Move cursor up by one line
    tput el #Clear the line
  done

done

Yukarıdakiler " timedatectl" sonucunu sonsuza kadar yazdıracak ve önceki yankıyı güncellenmiş sonuçlarla değiştirecektir.

Bu kodun sadece bir örnek olduğunu, ancak ihtiyaçlarınıza bağlı olarak sizin için belki de en iyi çözüm olmadığını belirtmeliyim. Hemen hemen aynı şeyi (en azından görsel olarak) yapacak benzer bir komut " watch -n 3 timedatectl" dir.

Ama bu farklı bir hikaye. :)

Umarım yardımcı olur!


3

Bu, yararlıdır, lütfen deneyin ve gerektiği gibi değiştirin.

#! bin/bash
for load in $(seq 1 100); do
    echo -ne "$load % downloded ...\r"
    sleep 1
done
echo "100"
echo "Loaded ..."

3

Bunu deneyebilirsiniz .. Benim kendi versiyonum ..

funcc() {
while true ; do 
for i in \| \/ \- \\ \| \/ \- \\; do 
  echo -n -e "\r$1  $i  "
sleep 0.5
done  
#echo -e "\r                                                                                      "
[ -f /tmp/print-stat ] && break 2
done
}

funcc "Checking Kubectl" & &>/dev/null
sleep 5
touch /tmp/print-stat
echo -e "\rPrint Success                  "

1

Benim en sevdiğim yol 50'ye uyu. Burada ideğişken yankı ifadeleri içinde kullanılmalıdır.

for i in $(seq 1 50); do
  echo -ne "$i%\033[0K\r"
  sleep 50
done
echo "ended"

bu güzel, ancak imleç ilk karakteri engelliyor. Sanırım ekodaki bazı boşluklar bunun üstesinden gelebilir.
maraton
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.