Bir komutun çıktısının bash'de mevcut olduğu satır sayısını nasıl sınırlayabilirim?


11

Kullanarak arka planda büyük bir dosya indirmeye başladım

$ nohup wget http://example.tld/big.iso &

bu da bana nohup.outçıktı içeren bir dosya verir wget.

Şimdi, daha sonra indirme işlemini izlemek istersem , kullanabilirim, $ tail -f nohup.outancak bu, terminal penceremi istediğimden daha hızlı doldurur. Ne görmek istiyorum sürekli güncellenen son satır (tıpkı wgetyalnız kullanırken olduğu gibi ).

Denedim $ tail -n 1 -f nohup.outama sadece ilk kuyruktan etkileniyor gibi görünüyor.

Genel olarak, bir komutun çıktısının kullanılabilir / görünür olduğu satır sayısını (bu durumda 1 ile) sınırlamak mümkünse, bu sorunu çözecektir. Çıktıyı Dairesel bir arabellekte bulundurma - normal ilerleme çubuğunun $ wget example.tld/big.isoyazdırılacağını düşünün .

Böyle bir çözüm var mı?

Yoksa ağaca yanlış mı tırmanıyorum? (Anlamı, nohupçıktısını sınırlamak veya başka bir şey yapmak daha kolay olur mu?)

Yanıtlar:


10

Kaydırma bölgesini sınırlamak istemiyorsanız (diğer cevabıma bakın), sonraki satırı yazdırmadan önce satır başlangıcına geri dönmek için satır başını kullanabilirsiniz. Geçerli çizgi bir önceki çizgiden daha kısa olduğunda gerekli olan çizginin geri kalanını temizleyen bir kaçış dizisi vardır.

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;

6

watchBurada kullanabilirsiniz :

watch -n 0.5 -e "tail -n 1 nohup.out"

Düzenle : -e(takma ad --exec) seçeneği burada uygun görünüyor. Özellikle watchçok küçük aralıklarla koşmayı hedefliyorsanız , bu , her döngüde sh -cdahili olarak koşmanın neden olduğu yükü azaltır watch.


2
Bu tailişlemin her saniye yeni bir işlem oluşturduğunu unutmayın; bu , önem verdiğiniz bir şey olabilir veya olmayabilir. Ayrıca, watch -n 0.1"sürekli güncellenen" kısmı simüle etmek için bir saniye altı aralık (ör. ) Belirttiğinizden emin olun . (Bu açıkça süreç ve dosya açık çağrı sayısını artırır.) Son olarak, OS X kullanıyorsanız, watchvarsayılan olarak mevcut olmadığı için MacPorts'tan alabilirsiniz .
janmoesen

Bu biraz geçici, ama böyle harika. Ama - Ben daha önceki çıktı görecekti böylece olmayan tam ekran cevabı bekliyordum gerçekten Kullanabileceğim watchyeni terminal penceresinde. Ayrıca kullanarak bu tespit tail -n 2daha faydalı -n 1olan wget, en azından ile, watchaksi takdirde son yüzdesi görülemez çünkü, 1 saniye içerisinde; Bu sizin cevabınızdaki bir kusur değil, ama başka birisinin nohup çıkışlı kuyrukları izlemeye karar vermesi durumunda bahsetmiştim.
Jari Keinänen

@janmoesen Bu özel senaryo için, yeni bir tailişleme sahip olmak büyük olasılıkla gereğinden fazla abartılı değildir; ancak genel bir cevap olarak bunu dikkate almak iyidir. Ayrıca watch -n 0.1işe yaramadı, ancak watch -n 0,1işe yaradı - daha önce terminal komut seçeneklerine uygulanan yerel ayarları görmemiş olsam da, uygulanan yerel ayarlar olabilir. Yan not olarak: brew install watchharika çalıştı :-)
Jari Keinänen

Yan not: Yerel ayarlarınızla watchçalışıp çalışmayacağınıza 0,1veya 0.1bu ayarlara bağlı olup olmayacağı (yerel ayarlarınız için tanımlanan ondalık sembolünü kullanır). Kontrol edin LC_ALL=C watch -n 0.1 "date +%S.%N".
rozcietrzewiacz

3

Terminalinizin kaydırılan hatlarını sınırlamak için kullanabileceğiniz belirli Xterm kontrol sekansları vardır. "Kaydırma Bölgesini Ayarla" yı arayın. Yine de biraz çamur var. Daha sonra terminalinizi sıfırladığınızdan emin olun:

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
clear; echo -n $'\e[1;2r'; tail -f nohup.out | grep --line-buffered .
# The "grep" line is to ensure a single line; you can also use "awk 1" or "sed" etc.

<Taşınabilirlikle ilgili olağan notu buraya
ekleyin

Bu başka bir harika alternatif, ancak tail -fyine de arabelleği doldururken ve ayrıca terminalin yine de sıfırlanması gerektiğinden özel pencerede en iyi kullanılan seçenek . Bu, umduğum gibi satır içi değil , ama aksi halde aradığım şey olabilir.
Jari Keinänen

0

Çıktının geçerli terminal penceresinin tamamını işgal etmesini istemiyorsanız, basit bir whiledöngü kullanabilirsiniz :

while true; do 
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo

1
Herhangi bir çıktı üreten komut çalışırken terminal çıktısını kaydırabilmeniz için terminal öykünücü ayarlarınızı düzenlemeniz ve devre dışı bırakmanız scrollTtyOutput(veya benzeri) seçeneğine dikkat etmeniz gerekir .
rozcietrzewiacz
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.