Hilang riwayat Bash saat menggunakan histappend

18

Saya suka menyimpan banyak sejarah, jadi saya telah histappendmenetapkan di .bashrc. Sebagian besar waktu semuanya bekerja dengan baik, dengan sejarah dibangun dari banyak cangkang yang ditambahkan. Namun, setiap sesekali, saya akan memulai shell baru dan menemukan bahwa saya telah kehilangan seluruh sejarah - dan sering hanya berisi beberapa perintah dari shell terakhir untuk keluar (yaitu itu bukan hanya menimpa bukan menambahkan ). Karena itu, saya curiga ini terjadi di shell exit, daripada dari proses lain yang membunuh .bash_historyfile. Mendukung kesimpulan ini, saya memiliki nomor perintah sejarah di prompt saya, dan saya belum pernah melihatnya melompat turun.

Adakah yang pernah mengalami masalah serupa? Atau bahkan hanya punya saran bagaimana melacak masalahnya?

Cascabel
sumber
1
Lihat: patch # 8676: Perbaiki truncating
.bash_history

Jawaban:

13

Maaf untuk menjawab pertanyaan saya sendiri, tetapi tidak ada jawaban lain yang benar-benar mengatasi masalah tersebut.

Saya akhirnya tahu bahwa ini hanya terjadi ketika menutup gnome-terminalsendiri (yaitu file> keluar, tombol 'x', alt + F4), dan itupun umumnya hanya ketika menutup beberapa terminal secara berurutan. Itu tidak pernah terjadi ketika menggunakan ctrl-D untuk menutup shell, membiarkan terminal mengikuti.

Jika saya bisa menjabarkannya dengan cukup baik, saya akan mengajukan laporan bug gnome-terminal. Sementara itu, mungkin ini akan membantu beberapa orang lain yang datang ke sini dari google!

Cascabel
sumber
10

Tidak tahu mengapa ini terjadi, tapi mungkin Anda dapat menghindari masalah dengan memaksa bash untuk menulis ke file histori setiap kali menampilkan prompt:

PROMPT_COMMAND="history -a; history -n"

Ini akan menulis (-a) dan kemudian membaca kembali (-n) file histori setiap kali bash meminta perintah berikutnya. Manfaat tambahan: Anda akan mendapatkan perintah X di shell 1 dalam sejarah shell 2.

innaM
sumber
Tidak berfungsi pada GNU bash, versi 3.00.15 (1) -release (i686-redhat-linux-gnu)
David Mackintosh
2
Bisakah Anda menjelaskan apa artinya "tidak berhasil"?
innaM
3
Manfaat tambahan yang Anda kutip dalam banyak kasus adalah kerugian. Itu bukan perilaku yang saya cari, karena saya mungkin akan melakukan dua tugas yang benar-benar terpisah dalam cangkang terpisah, dan tidak ingin berbaur sejarah mereka. Ini juga kemungkinan tidak akan membantu apa pun. Ketika riwayat hilang, ini menghapus konten .bash_history - Saya tidak berharap itu akan menjadi masalah apakah mereka ditulis di shell keluar atau oleh PROMPT_COMMAND.
Cascabel
5
history -nbersisik. Ini lebih dapat diandalkan untuk dilakukan history -a; history -c; history -r. Untuk menjelaskan ini, pertama-tama saya akan mencatat bahwa history -amelakukan hal yang benar - Anda .bash_historyakan berisi semua perintah yang Anda ketikkan, dalam urutan yang Anda ketikkan - dengan asumsi bahwa Anda menjalankan history -asetelah setiap perintah. Tantangannya adalah untuk menjaga agar ide shell tentang sejarah tetap sinkron dengan file .bash_history. Ini mudah -cdan -r, masalahnya adalah bisa lambat jika besar. -ndapat pecah karena kesalahan mengidentifikasi baris mana yang baru. (Saya kehabisan ruang di sini!)
Aaron McDaid
4
(... jika Anda menggunakan -n) Bayangkan Anda menjalankan perintah di shell 1: ls. Kemudian di shell lain, Shell Two, Anda jalankan cd. Sekarang, sejarah di .bash_history sudah benar karena history -adi PROMPT_COMMAND- Anda akan berisi ls \n cd \n. Selanjutnya, Anda kembali ke shell One dan mengetik pwd. Shell One berpikir bahwa hanya ada perintah dan sejarah ( ls). Sekarang ia berpikir ada dua perintah ( lsdan pwd) dalam sejarah. Ketika Anda -nberpikir, (Saya punya dua perintah dalam sejarah saya, dan ada dua perintah di .bash_history, oleh karena itu saya up to date.)
Aaron McDaid
3

Pengalaman saya adalah bahwa shell memperbarui file histori pada waktu keluar. Jadi "sejarah" awal shell bergantung pada pandangan shell terbaru tentang sejarah.

Hasil dari ini adalah Anda bisa mendapatkan perintah yang datang dan pergi dari sejarah, tergantung pada bagaimana shell lain mulai dan berhenti.

David Mackintosh
sumber
2
Saya sangat mengerti bagaimana file histori ditulis - inilah mengapa saya menentukan dalam pertanyaan saya yang saya gunakan histappend. Masalahnya bukan konten yang tidak terduga, tetapi total kehilangan konten yang disimpan sebelumnya.
Cascabel
Ini menjelaskan mengapa saya kehilangan sejarah ...
B Seven
1

Saya telah melihat ini terjadi sebelumnya tetapi itu adalah masalah dengan kesalahan disk yang terjadi dalam peningkatan frekuensi. Saya akan menjalankan pemindaian pada drive. Jika ternyata drive tersebut baik-baik saja, saya akan memeriksa untuk melihat apakah file ini tidak melampaui batas riwayat shell sewenang-wenang.

Sesuatu yang mungkin dapat mencegah hal itu terjadi adalah tetap memangkas file kembali ke 80 baris atau berapa banyak perintah yang Anda inginkan sejarahnya.

Axxmasterr
sumber
Saya tidak memiliki akses root pada mesin ini, tapi saya cukup yakin drive itu ok. Direktori rumah saya disimpan di server di lab kami (banyak RAID, saya percaya) dan nfs-mount. Apa yang Anda maksud dengan "batas histori shell arbitrer"? Ini semua terjadi jauh di bawah HISTSIZE dan HISTFILESIZE, dan meskipun saya telah menetapkan keduanya, mereka jauh di bawah intbash menyimpannya juga.
Cascabel
Saya harus mengatakan bahwa entri David Mackintosh mungkin adalah apa yang terjadi.
Axxmasterr
1
Saya sepenuhnya yakin itu tidak benar. Saya seharusnya tidak pernah berakhir dengan hanya dua perintah dalam sejarah saya, ketika shell terakhir untuk keluar memiliki beberapa lusin perintah, file sejarah memiliki beberapa ratus, dan HISTSIZE / HISTFILESIZE diatur ke 10000.
Cascabel