Bisakah saya mengonfigurasi bash untuk menjalankan "hapus" sebelum setiap perintah yang diketikkan di konsol?

22

Saya ingin mengkonfigurasi bash untuk menjalankan clearperintah setiap kali saya mengetik beberapa perintah di terminal (sebelum menjalankan perintah saya). Bagaimana saya bisa melakukan itu?

Saya menggunakan Linux Debian.

syntagma
sumber
Anda menemukan utas ini bermanfaat.
Thor
3
Hanya ingin tahu: Apa aplikasi Anda untuk ini? Kecuali ketika saya men-debug program dengan banyak output, saya biasanya ingin menyimpan sebanyak mungkin di layar untuk membantu saya melacak konteks tempat saya bekerja.
Joe

Jawaban:

22

Bash memiliki kait prekomand . Semacam.

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 'SANGAT berhenti menjadi jahat'
sumber
Gilles: Saya menempelkan di atas ke terminal konsole dan output dari setiap perintah yang saya masukkan kemudian dibersihkan sebelum saya bisa membacanya. Apakah saya melewatkan sesuatu? Juga, apa yang terjadi untuk ini (dan jawaban lainnya di bawah) jika saya menggunakan skrip bash multi-baris di mana lebih dari satu baris (atau baris apa pun selain yang terakhir) menghasilkan keluaran yang menarik?
Joe
@Joe Ini akan menghapus layar setelah Anda menekan Enter, sebelum menjalankan perintah. Ini berfungsi seperti ini untuk saya. Preexec hook dieksekusi untuk setiap perintah interaktif, tidak masalah apakah perintah itu built-in atau perintah eksternal atau banyak perintah.
Gilles 'SANGAT berhenti menjadi jahat'
1
@Jo Anda perlu menambahkan baris ini di bawah tidak melakukan apa pun jika menyelesaikan [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;masalahnya adalah PROMPT_COMMAND sedang dijalankan dan juga terjebak setelah perintah yang sebenarnya; Dapatkah seseorang memberitahu saya mengapa local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;ada di sini?
MageProspero
@JamesAndino history -1mencetak baris perintah terakhir, dengan nomor riwayat di depan. Filter sed menghapus nomor sejarah.
Gilles 'SO- berhenti bersikap jahat'
@ JamesAndino Itu membuatnya bekerja (dan saya melihat Giles menambahkannya ke jawabannya.)
Joe
6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

Setelah itu setiap kali Anda menekan returnalih-alih hanya menulis \nitu akan pindah ke awal baris, masukkan teks clear;, lalu pindah ke akhir dan masukkan \nseperti yang diharapkan.

buru-buru
sumber
2
Baris baru menyebabkan prompt untuk dicetak, jadi menempatkan jelas di prompt menyelesaikan hal yang sama tanpa mencemari sejarah clearperintah dengan perintah.
jw013
2
@ jw013 Perbedaannya adalah bahwa dalam kasus saya cleardieksekusi sebelum perintah dan output perintah tidak hilang. Namun dalam kasus dengan prompt itu.
buru
Saya berharap ada beberapa cara untuk melakukan ini tanpa harus memodifikasi baris perintah itu sendiri - Saya yakin ini akan memecah dengan cara yang menarik pada perintah kompleks atau multi-line tapi saya tidak dapat menemukan cara yang lebih baik untuk melakukan ini.
jw013
@ jw013, Anda benar, itu rusak untuk multi-baris .. Ini menyisipkan clear;output untuk setiap tambahan \n.
Peter.O
tip ini sangat bagus thx !! Saya perlu mengikat beberapa kode spesifik ke F2, tetapi beberapa kali baris memiliki beberapa perintah yang saya ketikkan tetapi tidak dieksekusi, jadi dengan ex ini: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""ia akan pindah ke awal, ketik ls;#komentar apa yang ada di sana, dan jalankan lsperintah dengan benar! Terima kasih!
Aquarius Power
2

dari pertanyaan yang saya tanyakan hari ini (dengan kredit ke jawaban pengguna @ aecolley ):

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

The \C-msimulasi 'Enter', yang \C-lsimulasi Ctrl+lseperti itu jelas dan \C-jadalah "baris baru-dan-indent", sehingga perintah mengikat Enter untuk Ctrl + l & Ctrl + j

yang bekerja pada GNU bash, versi 3.2.53 (1) -release (x86_64-apple-darwin14) dan jawaban lain di utas ini tidak. juga, ini tidak mencemari sejarah dengan perintah 'jelas' setiap perintah lainnya.

TRB
sumber
1
Catatan: jika menggunakan lebih dari ssh, Anda harus menjalankannya di lingkungan atau keanehan yang terjadi.
TRB
greate ini berfungsi di terminal ubuntu 16.04 saya, terima kasih tetapi bagaimana cara kerjanya, bisakah Anda memberikan tautan atau dokumentasi?
Andrzej Rehmann
0

Pertimbangkan untuk membersihkan jika Anda mau

cb4() {
  preexec () {
    clear
  }
}

Ini menggunakan pengait yang disebut preexec, karya terkonfirmasi dengan zsh juga

Kemudian setiap sesi yang Anda ingin hapus secara otomatis sebelum setiap perintah yang Anda jalankan: cb4

Jika Anda yakin Anda selalu ingin menghapus dalam setiap konteks

preexec () {
  clear
}

Dan jika Anda benar-benar ingin mengatur ulang terminal

ganti kata cleardengantput reset

tput opsional tetapi mempercepat proses reset

jasonleonhard
sumber