Jika Anda mengubah file histori maka Anda akan membuat masalah untuk diri Anda sendiri!
Namun dimungkinkan untuk mencatat perintah ke file terpisah. Anda dapat mengubah tindakan yang dilakukan saat Anda menjalankan baris untuk memasukkan logging baris saat ini, dan kemudian Anda dapat berkonsultasi file itu untuk mendapatkan informasi yang Anda inginkan.
Pertama-tama mari kita mendefinisikan fungsi yang dapat mencatat garis saat ini dan kemudian menjalankannya:
function log_and_accept {
echo "$TTY $BUFFER" >> /tmp/log
zle accept-line
}
Sekarang $ TTY adalah pengidentifikasi untuk shell Anda saat ini, tetapi itu bukan satu-satunya yang mungkin Anda gunakan. $ TTY adalah path ke file / dev / pts / NUMBER. Satu-satunya masalah di sini adalah bahwa angka ini selalu merupakan angka berikutnya yang tersedia, jadi jika Anda menutup satu terminal dan membuka yang lain maka Anda akan menggunakan kembali nomor tty yang sama.
Jika Anda tidak suka ini, maka mungkin juga untuk mendapatkan jalur yang menyertakan id proses dari shell (id proses juga dapat digunakan kembali, tetapi ini cenderung menghambat Anda - id proses digunakan oleh semua proses, sementara ttys hanya terminal). Ini dapat dengan mudah dilakukan berkat tautan / proc / self symlink, yang selalu menunjuk ke folder proses untuk proses yang melihatnya. Jadi untuk menggunakan folder proses, fungsi di atas adalah:
function log_and_accept {
process=/proc/self
echo "${process:A} $BUFFER" >> /tmp/log
zle accept-line
}
Sekarang, setelah Anda memutuskan bagaimana Anda ingin mengidentifikasi baris, bagian selanjutnya adalah benar-benar mengganti perilaku default dengan fungsi baru Anda. Perilaku default yang kami ganti adalah fungsi accept-line, dan jika kita melihat dokumentasi zle , Anda akan melihat bahwa accept-line terikat ke ^ J dan ^ M.
Untuk mengikat fungsi ini ke huruf-huruf itu, Anda harus mengubahnya menjadi widget:
zle -N log_and_accept_widget log_and_accept
Kemudian Anda dapat mengikatnya, menggantikan perilaku lama:
bindkey '^J' log_and_accept_widget
bindkey '^M' log_and_accept_widget
Sekarang zsh memiliki dukungan multi-baris, jadi ketika Anda melihat file ini, Anda mungkin menemukan bahwa garis-garis tersebut menjadi kurang jelas dari yang Anda harapkan semula. Berikut adalah beberapa output dari file yang saya hasilkan saat menguji ini:
/proc/19170 function log_and_accept {
shell=/proc/self
echo "${shell:A} $BUFFER" >> /tmp/log
zle accept-line
}
/proc/19170 echo woo
/proc/19170 cat /tmp/log
Anda mungkin ingin melewatkan $ BUFFER melalui sejenis printer yang cantik sebelum login.
Jika Anda mengalami masalah dalam melakukan ini dan Anda benar-benar sangat menginginkan perilaku lama kembali maka Anda dapat memulihkannya dengan:
bindkey '^J' accept-line
bindkey '^M' accept-line
Meskipun sebenarnya menjalankan perintah-perintah itu mungkin ... sulit.