Konsolda yazılan her komuttan önce bash'i “clear” yapacak şekilde yapılandırabilir miyim?


22

clearTerminalde bazı komutlar yazdığımda bash komutunu çalıştırmak için bash'ı yapılandırmak istiyorum (komutumu çalıştırmadan önce). Bunu nasıl yapabilirim?

Debian Linux kullanıyorum.


Bu konuyu yararlı buluyorsunuz .
Thor

3
Sadece meraklı: Bunun için başvuru nedir? Çok fazla çıktıya sahip programlarda hata ayıklamak dışında, üzerinde çalıştığım bağlamı
Joe

Yanıtlar:


22

Bash'in ön kumanda kancası var . Sırala.

preexec () {
  clear
}
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return                     # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

Gilles: Yukarıdakileri bir konsole terminale yapıştırdım ve daha sonra girdiğim her komutun çıktısı okuyamadı. Bir şey mi eksik? Ayrıca, birden fazla satırın (veya sonuncunun dışındaki herhangi bir satırın) ilginç çıktılar ürettiği çok satırlı bir bash betiği çağırırsam, bunun için (ve aşağıdaki diğer cevap) ne olur?
Joe,

@Joe Bu Enter, komutu yerine getirmeden önce tuşuna bastıktan sonra ekranı temizlemelidir . Benim için böyle çalışıyor. Preexec kancası her bir etkileşimli komut için yürütülür, komutun yerleşik mi harici bir komut mu yoksa birçok komut mu olduğu önemli değildir.
Gilles 'SO- kötülük olmayı'

1
@Joe, eğer [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;bu problemi tamamlarsanız PROMPT_COMMAND'ın çalıştırılması ve asıl komuttan sonra kapana kısılması ; Ayrıca bazıları neden local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;burada olduğunu söyleyebilir mi?
MageProspero 2

@JamesAndino history -1, geçmiş komut satırı önünde bir tarih numarası ile yazdırır. Sed filtre geçmiş numarasını çıkarır.
Gilles 'SO- kötülük olmayı bırak'

@JamesAndino Bu işe yaradı (ve Giles'in cevabına eklediğini görüyorum.)
Joe

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

Bundan sonra returnsadece yazmak yerine bastığınız her seferde \nsatırın başına hareket eder, metni girin clear;, sonra sonuna gidin ve \nbeklendiği gibi girin .


2
Bir satır istemi, neyse baskılı istemi yapar aynı şeyi net koyarak bu yüzden neden olur olmadan komut geçmişini kirletici clearkomutları.
jw013

2
@ jw013 Aradaki fark, benim durumumda clearkomut ve komut çıktısının kaybolmamasından önce yapılmasıdır. Ancak istemi durumunda durumunda yapar.
acele

Keşke komut satırını değiştirmek zorunda kalmadan bunu yapmanın bir yolu olsaydı - Bunun karmaşık ya da çok satırlı komutlarda ilginç şekillerde kırılacağından eminim ama bunun için daha iyi bir yol bulamıyorum.
jw013

@ jw013, haklısın, çok satırlı kesiliyor .. clear;Her ekstra için çıkışa ekliyor \n.
Peter.O

Bu ipucu çok iyi thx! Bazı özel kodları F2'ye bağlamak zorunda kaldım, ancak bazı durumlarda satırın yazdığım bazı komutları var ancak çalıştırılmadı, bu nedenle şu: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""başlangıçta hareket eder ls;#, orada olanı yorumlayarak yazın ve lskomutu doğru şekilde çalıştırın ! Teşekkürler!
Kova Gücü

2

bugün sorduğum bir sorudan (user @ aecolley'nin cevabına krediyle ):

bind '"\C-m": "\C-l\C-j"'

\C-m, 'Enter' tuşu simüle \C-lsimüle Ctrl+laçık ve aşağıdaki gibi \C-jolan "satır-ve girinti" komut Ctrl + l ve Ctrl + j için girin bağlayıcıdır böylece

GNU bash, sürüm 3.2.53 (1) - yayın (x86_64-apple-darwin14) üzerinde çalışır ve bu konudaki diğer cevaplar yok. Ayrıca, bu, diğer her komutta 'clear' komutları ile geçmişi kirletmez.


1
Not: Eğer ssh üzerinden kullanıyorsanız, o ortamda çalıştırmalısınız, aksi halde tuhaflık olur.
TRB

ubuntu 16.04 terminalimde çalıştığını düşünüyorum, teşekkürler ama nasıl çalışır, lütfen bağlantı veya bazı belgeler sağlayabilir misiniz?
Andrzej Rehmann,

0

Sadece istediğiniz zaman temizlemeyi düşünün

cb4() {
  preexec () {
    clear
  }
}

Bu da denilen bir kanca kullanır preexec, onaylanmış zsh ile de çalışır

Ardından, çalıştırdığınız her komuttan önce otomatik olarak silmek istediğiniz herhangi bir oturum: cb4

Eminseniz, her zaman her bağlamda temizlemek istediğinizde

preexec () {
  clear
}

Ve eğer gerçekten terminali sıfırlamak istiyorsanız

sözcüğü clearile değiştirtput reset

tput isteğe bağlıdır ancak sıfırlama işlemini hızlandırır

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.