Sinyal kreatif dan melibatkan, katamu? BAIK:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
Chuck itu masuk .bashrc
dan pergi. Ini menggunakan sinyal untuk memberi tahu setiap bash
proses untuk memeriksa entri sejarah baru ketika yang lain keluar. Ini sangat mengerikan, tetapi benar-benar berfungsi.
Bagaimana cara kerjanya?
trap
menetapkan pengendali sinyal untuk sinyal sistem atau salah satu peristiwa internal Bash. The EXIT
event adalah setiap penghentian dikendalikan dari shell, sementara USR1
ini SIGUSR1
, sinyal berarti kita mengambil alih.
Setiap kali shell keluar, kami:
- Tambahkan semua riwayat ke file secara eksplisit.
- Nonaktifkan
SIGUSR1
pawang dan buat cangkang ini mengabaikan sinyal.
- Kirim sinyal ke semua
bash
proses yang berjalan dari pengguna yang sama.
Ketika sebuah SIGUSR1
tiba, kami:
- Muat semua entri baru dari file riwayat ke dalam daftar riwayat di dalam memori shell.
Karena cara Bash menangani sinyal, Anda tidak akan benar-benar mendapatkan data sejarah baru sampai Anda menekan Enterwaktu berikutnya, jadi ini tidak melakukan lebih baik di bagian depan itu daripada menempatkan history -n
ke dalam PROMPT_COMMAND
. Itu menyimpan membaca file terus-menerus ketika tidak ada yang terjadi, dan tidak ada tulisan sama sekali sampai shell keluar.
Namun, masih ada beberapa masalah di sini. Yang pertama adalah respons default SIGUSR1
adalah untuk menghentikan shell. Setiap bash
proses lain (menjalankan skrip shell, misalnya) akan dimatikan. .bashrc
tidak dimuat oleh cangkang non-interaktif. Sebagai gantinya, sebuah file bernama by BASH_ENV
dimuat : Anda dapat mengatur variabel itu di lingkungan Anda secara global untuk mengarah ke file dengan:
trap '' USR1
di dalamnya untuk mengabaikan sinyal di dalamnya (yang menyelesaikan masalah).
Akhirnya, meskipun ini melakukan apa yang Anda minta, pemesanan yang Anda dapatkan akan sedikit tidak biasa. Secara khusus, bit histori akan diulang dalam urutan yang berbeda saat mereka dimuat dan disimpan secara terpisah. Itu pada dasarnya melekat pada apa yang Anda minta, tetapi perlu diketahui bahwa up-arrow history menjadi jauh lebih tidak berguna pada saat ini. Pergantian sejarah dan sejenisnya akan dibagikan dan berfungsi dengan baik.