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?
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.
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_COMMANDlocal 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: 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.
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.
Jawaban:
Bash memiliki kait prekomand . Semacam.
sumber
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.[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;
masalahnya adalah PROMPT_COMMAND sedang dijalankan dan juga terjebak setelah perintah yang sebenarnya; Dapatkah seseorang memberitahu saya mengapalocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
ada di sini?history -1
mencetak baris perintah terakhir, dengan nomor riwayat di depan. Filter sed menghapus nomor sejarah.Setelah itu setiap kali Anda menekan returnalih-alih hanya menulis
\n
itu akan pindah ke awal baris, masukkan teksclear;
, lalu pindah ke akhir dan masukkan\n
seperti yang diharapkan.sumber
clear
perintah dengan perintah.clear
dieksekusi sebelum perintah dan output perintah tidak hilang. Namun dalam kasus dengan prompt itu.clear;
output untuk setiap tambahan\n
.bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
ia akan pindah ke awal, ketikls;#
komentar apa yang ada di sana, dan jalankanls
perintah dengan benar! Terima kasih!dari pertanyaan yang saya tanyakan hari ini (dengan kredit ke jawaban pengguna @ aecolley ):
The
\C-m
simulasi 'Enter', yang\C-l
simulasiCtrl+l
seperti itu jelas dan\C-j
adalah "baris baru-dan-indent", sehingga perintah mengikat Enter untuk Ctrl + l & Ctrl + jyang 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.
sumber
Pertimbangkan untuk membersihkan jika Anda mau
Ini menggunakan pengait yang disebut
preexec
, karya terkonfirmasi dengan zsh jugaKemudian 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
Dan jika Anda benar-benar ingin mengatur ulang terminal
ganti kata
clear
dengantput reset
tput
opsional tetapi mempercepat proses resetsumber