Saya tahu pertanyaan ini tidak jelas, seperti yang ditanyakan di sini terus diperbarui (dan digandakan di sini).
Apa yang saya coba capai sedikit berbeda. Saya tidak suka gagasan prompt saya menulis ulang file setiap ls
saya ketik ( history -a; history -c; history -r
).
Saya ingin memperbarui file saat keluar. Itu mudah (sebenarnya, default), tetapi Anda harus menambahkan alih-alih menulis ulang:
shopt -s histappend
Sekarang, ketika terminal ditutup, saya ingin membuat semua yang lain tetap terbuka untuk mengetahui pembaruan.
Saya lebih suka melakukan ini tanpa memeriksa $PS1
pada setiap command
yang saya ketik. Saya pikir akan lebih baik untuk menangkap semacam sinyal. Bagaimana Anda akan melakukannya? Jika tidak memungkinkan, mungkin sederhana cronjob
?
Bagaimana kita bisa memecahkan teka-teki ini?
sumber
bash
. Mungkin sudah waktunya untuk memeriksa sesuatu yang baru, hanya untuk bersenang-senang.Jawaban:
Sinyal kreatif dan melibatkan, katamu? BAIK:
Chuck itu masuk
.bashrc
dan pergi. Ini menggunakan sinyal untuk memberi tahu setiapbash
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. TheEXIT
event adalah setiap penghentian dikendalikan dari shell, sementaraUSR1
iniSIGUSR1
, sinyal berarti kita mengambil alih.Setiap kali shell keluar, kami:
SIGUSR1
pawang dan buat cangkang ini mengabaikan sinyal.bash
proses yang berjalan dari pengguna yang sama.Ketika sebuah
SIGUSR1
tiba, kami: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 dalamPROMPT_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. Setiapbash
proses lain (menjalankan skrip shell, misalnya) akan dimatikan..bashrc
tidak dimuat oleh cangkang non-interaktif. Sebagai gantinya, sebuah file bernama byBASH_ENV
dimuat : Anda dapat mengatur variabel itu di lingkungan Anda secara global untuk mengarah ke file dengan: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.
sumber
.bashrc
file, dan kemudian ada sesuatu seperti cronjob datang dan menggunakan file secara berkala, mengirimSIGUSR1
sesuai potongan Anda, apakah Anda bisa mendapatkan kembali sejarah panah naik kronologis?linux bug
?? Mengapa proses lain menangkap USR1? (Saya tahu ini tidak dimaksudkan untuk dibahas di sini, tapi mungkin saya akan menjelaskannya di tempat yang benar)BASH_ENV
seperti yang dinyatakan dalam jawaban ini? Atau apakah Anda tahu cara yang lebih standar untuk mematikan kejahatan ini?