Cara login di sesi terminal mana perintah zsh dijalankan

3

Dalam file riwayat zsh, semua perintah dicatat dari semua sesi terminal. Apakah ada cara untuk login di sesi terminal mana perintah dijalankan (yaitu, pengidentifikasi unik untuk instance shell ini?).

Case use yang mungkin untuk ini adalah melihat file history dan menentukan apa yang dijalankan sebelum atau setelah perintah yang diberikan, terbatas pada sesi yang tepat ini.

a3nm
sumber

Jawaban:

1

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.

Matthew Franglen
sumber
Terima kasih banyak atas jawaban terperinci ini. Saya akhirnya mengubah fungsi zshaddhistory () untuk menyimpan garis sejarah dalam format khusus dalam file kustom serta mempersiapkannya untuk file log standar. Detail: gitorious.org/myconfig/myconfig/blobs/master/zsh/zshrc#line191 . Jika Anda bertanya-tanya tentang motivasi: a3nm.net/blog/ttyrex.html .
a3nm
Kedengarannya cukup rapi. Saya menggunakan ttyrec beberapa waktu lalu untuk presentasi tetapi saya tidak puas dengan cara yang tersedia untuk menanamkannya.
Matthew Franglen