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 .bashrcdan pergi. Ini menggunakan sinyal untuk memberi tahu setiap bashproses untuk memeriksa entri sejarah baru ketika yang lain keluar. Ini sangat mengerikan, tetapi benar-benar berfungsi.
Bagaimana cara kerjanya?
trapmenetapkan pengendali sinyal untuk sinyal sistem atau salah satu peristiwa internal Bash. The EXITevent adalah setiap penghentian dikendalikan dari shell, sementara USR1ini SIGUSR1, sinyal berarti kita mengambil alih.
Setiap kali shell keluar, kami:
- Tambahkan semua riwayat ke file secara eksplisit.
- Nonaktifkan
SIGUSR1pawang dan buat cangkang ini mengabaikan sinyal.
- Kirim sinyal ke semua
bashproses yang berjalan dari pengguna yang sama.
Ketika sebuah SIGUSR1tiba, 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 -nke 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 SIGUSR1adalah untuk menghentikan shell. Setiap bashproses lain (menjalankan skrip shell, misalnya) akan dimatikan. .bashrctidak dimuat oleh cangkang non-interaktif. Sebagai gantinya, sebuah file bernama by BASH_ENVdimuat : 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.