terkadang perintah histori tidak disimpan di .bash_history

20

Saya mengeluarkan banyak perintah kemarin di CentOS 7. Tetapi ketika saya ingin mengambil perintah ini hari ini, saya menemukan tidak ada catatan. Ketika saya membuka file .bash_history, saya masih tidak dapat menemukan perintah yang saya keluarkan kemarin tetapi saya menemukan banyak perintah lama beberapa hari yang lalu. Mengapa perintah terbaru tidak disimpan? Bagaimana saya bisa meningkatkan kemampuan riwayat?

Mendongkrak
sumber
Kadang-kadang ketika terminal ditutup secara tidak normal, sejarah tidak disimpan, itu terjadi pada saya juga, tetapi saya tidak tahu keadaan yang menyebabkan perilaku ini
mazs

Jawaban:

11

Penyebab paling mungkin untuk item riwayat tidak muncul adalah bukan dengan menetapkan HISTFILEke nol atau HISTSIZEnol, itu adalah dengan masuk ke mesin yang sama dua kali dan keluar dengan instance bash kedua (di mana Anda melakukan sedikit atau tidak sama sekali) setelah yang mana kamu banyak melakukan. Secara default Bash tidak menggabungkan sejarah dan Bash-exit kedua menimpa .bash_historyyang dengan sangat baik diperbarui oleh Bash-exit pertama.

Untuk mencegah hal ini terjadi, Anda dapat menambahkan ke file riwayat alih-alih menimpa, Anda dapat menggunakan histappendopsi shell:

Jika opsi histappend shell diaktifkan (lihat deskripsi shopt di bawah SHELL BUILTIN COMMANDS di bawah), baris ditambahkan ke file histori, jika tidak file histori akan ditimpa.

Lebih detail dalam jawaban ini termasuk cara menggunakan HISTSIZE, HISTFILESIZEdan HISTCONTROLuntuk mengontrol ukuran, duplikat dll.

Anthon
sumber
3

Untuk mengubah ukuran riwayat gunakan dua variabel BASH HISTSIZE, HISTFILESIZE(biasanya diatur dalam .bashrc).

Deskripsi dari halaman manual BASH:

HISTSIZE Jumlah perintah yang harus diingat dalam histori perintah (lihat SEJARAH di bawah). Jika nilainya 0, perintah tidak disimpan dalam daftar riwayat. Nilai numerik yang kurang dari nol menghasilkan setiap perintah yang disimpan dalam daftar riwayat (tidak ada batasan). Shell menetapkan nilai default ke 500 setelah membaca semua file startup.

HISTFILESIZE Jumlah maksimum baris yang terkandung dalam file histori. Ketika variabel ini diberi nilai, file riwayat dipangkas, jika perlu, tidak mengandung lebih dari jumlah baris dengan menghapus entri tertua. File histori juga terpotong ke ukuran ini setelah menulisnya ketika sebuah shell keluar. Jika nilainya 0, file histori dipotong ke ukuran nol. Nilai non-numerik dan nilai numerik kurang dari nol menghambat pemotongan. Shell menetapkan nilai default ke nilai HISTSIZE setelah membaca file startup apa pun.

Sebagai contoh, saya memiliki pengaturan berikut di .bashrcfile saya :

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
coffeMug
sumber
1

Saya mengalami ini tetapi solusinya tidak tercantum di sini. Penyebabnya hanyalah masalah copy + paste yang sederhana. Saya menyalin perintah dari dokumen lain dan saya memiliki ruang putih ekstra di clipboard. Untuk beberapa alasan ini menyebabkan Ubuntu tidak menyimpan perintah ke file histori.

masukkan deskripsi gambar di sini

Gambar di atas adalah perintah yang saya miliki di clipboard saya dari google docs. Perintah ini dijalankan tetapi dihilangkan dari riwayat saya. Saya baru saja kembali dan memilih perintah tanpa spasi dan kemudian muncul dalam sejarah bash.

Tycon
sumber
5
Salah satu opsi riwayat adalah mengabaikan (jangan menyimpan) garis yang dimulai dengan spasi. Biasanya tidak disetel ke aktif. Ini bisa diubah di .bashrc Anda.
pejantan
1

Verifikasi bahwa HISTCONTROLvariabel lingkungan Anda tidak disetel ke ignorespaceatau ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Anda dapat memodifikasinya dengan menetapkan nilai pada file ~/.bash_profileAnda atau Anda ~/.profile:

HISTCONTROL=ignoredups

Dari bashhalaman manual:

HISTCONTROL

Daftar nilai yang dipisahkan oleh titik dua yang mengendalikan bagaimana perintah disimpan pada daftar riwayat.

Jika daftar nilai termasuk ignorespace, garis yang dimulai dengan karakter spasi tidak disimpan dalam daftar riwayat.

Nilai ignoredupsgaris penyebab yang cocok dengan entri riwayat sebelumnya tidak disimpan.

Nilai ignorebothadalah singkatan untuk ignorespacedan ignoredups.

Nilai erasedupspenyebab semua garis sebelumnya yang cocok dengan garis saat ini akan dihapus dari daftar riwayat sebelum garis itu disimpan.

Nilai apa pun yang tidak ada dalam daftar di atas diabaikan.

Jika HISTCONTROL tidak disetel, atau tidak menyertakan nilai yang valid, semua baris yang dibaca oleh parser shell disimpan pada daftar riwayat, dengan tunduk pada nilai HISTIGNORE. Baris kedua dan selanjutnya dari perintah majemuk multi-baris tidak diuji, dan ditambahkan ke riwayat terlepas dari nilai HISTCONTROL.

gawi
sumber