Bagaimana cara menyinkronkan sejarah perintah sesi terminal di bash?

13

Saya sudah mencoba mencari ~/.bash_historyperintah baru saya saat berada di sesi terminal tetapi mereka tidak ada di sana. Saya kira ini karena saya memiliki beberapa sesi terminal terbuka.

Apakah ada cara saya dapat menyinkronkan (mis. Sync-push atau sync-write-out) riwayat perintah sesi terminal saat ini ke dalam file bash_history (tanpa menutup sesi dan kehilangan lingkungan itu)?

(Ini akan jauh mirip dalam ide bagaimana syncperintah menyimpan modifikasi sistem file pada beberapa sistem.)

Saya membayangkan saya bisa mengatur bash untuk menyimpan beberapa riwayat sesi tetapi kemampuan untuk mendorong buffer sejarah saat ini masih akan berguna dalam skenario ketika Anda bekerja pada mesin baru dan Anda secara tidak sengaja lupa mengatur bash dengan cara yang mungkin Anda inginkan .

n611x007
sumber
Saya sudah mencoba history -a perintah shell builtin tetapi entah bagaimana saya sekarang mendapatkan 'izin ditolak' pada .bash_historyfile, setelah itu.
n611x007
Pertanyaan duplikat. Lihat: unix.stackexchange.com/questions/1288/...
Eduardo Leggiero

Jawaban:

19

Tambahkan baris ini ke .bashrc:

export PROMPT_COMMAND="history -a; history -n"

Buka terminal baru dan periksa.

Penjelasan

  • history -a menambahkan baris riwayat baru ke file riwayat.
  • history -nmemberitahu bashuntuk membaca baris yang tidak dibaca dari file riwayat ke daftar riwayat sesi saat ini.
  • PROMPT_COMMAND: isi dari variabel ini dijalankan sebagai perintah biasa sebelum bashshow prompt. Jadi setiap kali setelah Anda menjalankan perintah, history -a; history -ndieksekusi, dan bashriwayat Anda disinkronkan.
cuonglm
sumber
Terima kasih! Saya tidak tahu mengapa saya mendapat izin yang ditolak sebelumnya tetapi dengan terminal baru sekarang ini sepertinya berfungsi seperti yang diharapkan! Saya kira saya seharusnya dapat menggunakan history -aterminal dengan bashrc yang tidak dimodifikasi juga.
n611x007
kapan kita harus mulai khawatir tentang implikasi kinerja ini? (Saya berpikir tentang perangkat kelas atas, tidak yakin seberapa besar biaya overhead ini.)
n611x007
1
Anda juga mungkin sudah memiliki perintah cepat, dalam hal ini lebih baik digunakanexport PROMPT_COMMAND="${PROMPT_COMMAND};history -a; history -n"
Fabian
Jika ${PROMPT_COMMAND}kosong ini memberikan kesalahan karena pemimpin;
Boris Däppen
@ BorisDäppen benar, tetapi ini mudah diatasiexport PROMPT_COMMAND="${PROMPT_COMMAND}${PROMPT_COMMAND:+;}history -a; history -n"
TML