Gerçek zamanlı olarak bir komutun çıkardığı satır sayısını nasıl görüntüleyebilirim?


15

svn exportUygulamam için bir paketleyici komut dosyasının parçası olarak kullanıyorum ve bu komutun, diğerleri gibi, ilerleme çubuğu bulunmadığı anlaşılıyor.

Şu anda iki seçeneğim var:

  • seçenekleri olmadan kullanın ve binlerce satır yazdırmasını izleyin
  • kullanma --quietve tamamlanana kadar hiçbir şey görmeme.

En azından komutun çıkardığı satır sayısını gerçek zamanlı olarak göstermenin bir yolu var mı? Gibi:

Exporting SVN directory ... 1234 files

Ve bu sayı 1234 artışını gerçek zamanlı olarak görüyor musunuz? Ben çıkış sadece bunu yapacak bir komuta boru düşünebilirsiniz, ama hangisini?

Yanıtlar:


16
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

Veya köşeli parantez içindeki bölümü bir kabuk betiğine koyun. Bunun yalnızca kabuğunuz bash veya ksh93 veya zsh gibi ön öncelik operatörünü destekliyorsa işe yarar. Aksi takdirde, artırmanız $Ive ardından yazdırmanız gerekir (olduğu gibi I=$((I+1));printf...). Ayrıca, printfkabuğunuzla bir yerleşik değilse (mevcut bashlı bir yerleşik değilse), daha iyi performans için echo -neveya print -nyerine kullanabilirsiniz . Sadece satırsonu bastırmak ve bir kaçış karakteri olarak yorumlanması istiyorum.


Oh, kendimi asla tüm çirkin =ve `=` farklılıkları ve tuhaflıkları ile bashscripting'i öğrenmem . :) Neden python benzeri sözdizimi dili ile değiştirmiyorlar ...
Boris Burkov

Hey, biliyorum, ne! Yazdırdığınız her yeni satıra satır başı simgesi ekleyebilirsiniz ve ekranın üzerine taşmaz, sadece önceki satırın üzerine yazılır.
Boris Burkov

Bu yüzden a ile printfbiter \r. Ve yaparsan ne olur echo -ne "$I\r"ya print -n "$I\r". :) printfAncak kullandım , çünkü varsayılan olarak sonunda bir yeni satır yazdırmıyordu, bu yüzden \rsadece başlangıca geri dönüyor. Ne yazık ki tüm yankı uygulamaları -eya da -nargümanı desteklemiyor .
dannysauer

1
Bu, OpenBSD'nin / bin / sh için kullandığı pdksh sürümü ile de çalışır.
kurtm

1
Kesinlikle doğru olması için olsa 1,, değiştirmek gerekir readiçin read -r(bir satırın sonunda aksi bir ters eğik çizgi beri olur sayma ile karışıklık). Bu arada, biraz çalışma ile, bu, bazı komutlar için yararlı olabilecek en son çıktı satırını gösterecek şekilde de uyarlanabilir.
ruakh

7

Bu kaba bir fikirdir, ancak pvkomut satırını geçtikleri sırada saymak ve bunu ekranda görüntülemek için kullanabilirsiniz. pvbirçok anahtar arasında, -lher satırı geçerken sayan bir anahtar vardır.

Misal

Burada SVN çıktısından bazı dosyaları simüle etmek için while döngüsü kullanıyorum.

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

Çıkış hattının üzerine yazmaya devam edecektir:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

Ben pv bilmiyordum. Bir şeyler öğrenmek için Yaşasın!
dannysauer

@dannysauer - pv öğrenmeye biraz zaman ayırmaya değer, bir borudan geçen her şeyin ölçülmesini ve görüntülenmesini sağlar.
slm

Yorumu okuduktan ve onunla oynadıktan sonra yükledim. On sekiz yıl Linux kullanıyor ve keşfedilecek her zaman yeni şeyler var. :)
dannysauer

0

Komutunuzu arka planda bir iş olarak çalıştırabilir ve stdout'unu (ve isteğe bağlı olarak stderr) bir günlük dosyasına yönlendirebilirsiniz: command > logfile &burada &işi belirtir (stderr de varsa, &>yerine söyle >).

Ardından, günlük dosyanızdaki satır sayısını saymak için wordcount yardımcı programını kullanabilirsiniz wc -l.

Dinamik olarak değişen bir satırdaki durum değişikliğini göstermek için, benzer bir şey kullanabilirsiniz while true; do echo -en '\r'; wc -l logfile; sleep 1; done, ancak \rönceki satırın içeriğini öldürmek için satır başı çizmeye bash'ı zorlayamam .

Bu soruya bakın, neredeyse bir kopya: /programming/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash


1
Ancak, wc'nin yaptığı gibi, artmaya devam eden gerçek zamanlı bir görüntü istiyor.
kurtm

@kurtm eh, çok daha fazlasını istediği, ekranını printf/print/echodanny tarafından önerilen sonuçlarla doldurmamaktır . :) Tabii ki kullanabilirdi less, ama sanırım, wc -l logfileher zaman sabırsız olduğunu söyleyebilir . Bence, ncursesekranla oynamak ya da ekranı temizlemek aşırıya kaçmak.
Boris Burkov

İyi evet. Su basmasını istemiyor, ancak ilerlemeyi bilmek istiyor, aksi takdirde --quiet'i kullanabilirdi.
kurtm

@kurtm güncellemeye bakın: komutumda hata ayıklamaya yardımcı olabilir misiniz echo -e 'r'? Önceden yazdırılmış satırın içeriğini silmeli, böylece dinamik olarak değişir, ancak bunu yapmaya zorlayamam :(
Boris Burkov

Ayrıca, takip eden satırsonu bastıran echo'ya n seçeneğini eklemek istersiniz.
kurtm
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.