Bash girişini ekranın üst satırında tutun


12

bashKomut istemi girişini ekranın üstünde tutmak istiyorum , böylece eski komutlardan gelen çıktılar yukarı değil aşağı doğru itilir.

Bunu nasıl başarabilirim?


6
Yani, eğer catbir dosya, ters sipariş olur?
chaos

Hayır, ama çıktı parçalarının aşağı doğru itilmesini istiyorum
Tom Price

1
bashbunu yapamaz, çünkü bashekran konumlarını bile bilmiyor: sadece bir çıktı dosyasına yazıyor. bashİmlecin ne zaman sıfırlanacağını ve pencerenin ne zaman kaydırılacağını bilmek için etkileşimli istemini bilen bir terminal emülatörüne ihtiyacınız olacaktır .
chepner

Teşekkürler @chepner, bu sorunu tekrar ziyaret ediyorum ve yorumunuz beni bash'ın dışına bakmaya ve tüm ekran yığınına bakmaya başladı. Metin tabanlı sanal konsollarda (yani X Windows yok) kalmak istiyorum, bu yüzden şimdilik terminal emülatörlerinden kaçınıyorum, ancak GUI oturumlarım için kesinlikle buna bakacağım. Herkesin bu soruya rastlaması durumunda, tahminim tty ile ilgisi var ve şu anda burada ilham almak için arıyorum ... linusakesson.net/programming/tty
Tom Price

Yanıtlar:


7

Bu satırları ekleyin .bashrc:

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bashgösteri isteminden önce komutu yürütecek olan PROMPT_COMMAND var bash. Burada , imleci ekranın üst kısmına ayarlamak için tput işlevini prompt_on_topkullanan bir işleve ayarladık.

bashayrıca, herhangi bir komutu yürütmeden önce, sinyali işlemek için tuzak kullanarak bir komutu yürütmenin bir yoluna sahiptir DEBUG. Burada pre_cmd, eski ekranı temizleyecek ve tamamlamayı ( COMP_LINE boş değil) veya komutu çalıştırırsak hiçbir şey yapamayacak şekilde ayarladıkBASH_PROMPT .


Bu yaklaşımla ilgili bir sınırlama vardır, eğer komut çıktısı bir ekrana çok uzunsa, çıktı prompt_on_topeylemle geçersiz kılınır . Bu durumda, tüm çıktıyı okumak için çıktıyı bir çağrı cihazına bağlamanız gerekir.


1
İyi açıkladığınız cevabınız için teşekkürler, okuyacağım ve öğreneceğim çok şey var. Senaryonuzu test ettim ve şu anda etkili bir şekilde ekrandan eski çıktıyı komutlar arasında siler. Önceki çıktıları ekranda, istemin altında tutmak ve istem ile eski çıktı arasına yeni çıktılar eklenmesini ve böylece eski çıktıyı ekranın aşağıya itmesini istiyorum.
Tom Price

Buraya bir web araması yoluyla gelenler için, bu kod github.com/swirepe/alwaysontop da "bash isteminizi ekranın üstünde tutar" ve birkaç diğer işlev. Yine de orijinal soruya cevap vermez: cuonglm kodunda olduğu gibi eski komut çıktıları silinir.
WillC

Bu çözümün bir başka dezavantajı, en son hangi komutun yürütüldüğü hakkında geri bildiriminizin olmamasıdır. Yani, içeriği cat filegösterecektir file, ancak yürütülen komutun hemen geri bildirimini almazsınız. İdeal olarak, komut isteminin yürütülen komutun genişlememiş + genişletilmiş sürümü, ardından std çıkışı izlenir.
psikoslave
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.