Berapa lama isi file .bash_history bertahan?

11

Bagaimana saya bisa memodifikasi konten bash_historyfile saya ? Nilai atau variabel apa yang mengontrol berapa lama riwayat berlangsung? Adakah hal lain yang dapat saya ubah untuk memberikan kontrol yang lebih baik terhadap riwayat BASH saya ??

nbro
sumber
2
Saya tidak percaya file ini dikendalikan oleh lamanya waktu, melainkan ukuran file. Lihat di sini: Apakah ada cara untuk mengatur ukuran daftar riwayat di bash menjadi lebih dari 5000 baris? . Jadi env. variabel HISTSIZEdan HISTFILESIZEsatu-satunya permukaan kontrol yang harus Anda kontrol berapa banyak sejarah dipertahankan.
slm

Jawaban:

12

Ada dua variabel yang mengontrol ukuran histori:

HISTFILESIZE Jumlah maksimum baris yang terkandung dalam file histori. Ketika variabel ini diberi nilai, file histori dipotong, jika perlu, mengandung tidak lebih dari jumlah baris dengan menghapus entri tertua. File histori juga dipotong ke ukuran ini setelah menulisnya ketika sebuah shell keluar. Jika nilainya 0, file riwayat 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.

dan

HISTSIZE Jumlah perintah yang perlu diingat dalam sejarah 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.

Dua variabel ini memungkinkan Anda untuk mengontrol perilaku riwayat Anda. Pada dasarnya, HISTSIZEadalah jumlah perintah yang disimpan selama sesi Anda saat ini dan HISTFILESIZEjumlah perintah yang akan diingat di seluruh sesi. Jadi, misalnya:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

Dalam contoh di atas, karena HISTSIZEdiatur ke 10, historymengembalikan daftar 10 perintah. Namun, jika Anda keluar lalu masuk kembali, historyhanya akan mengembalikan 5 perintah karena HISTFILESIZEdiatur ke 5. Ini karena, setelah Anda keluar dari sesi Anda, HISTFILESIZEbaris riwayat Anda disimpan ke file riwayat Anda ( ~/.bash_historysecara default tetapi dikontrol oleh HISTFILE). Dengan kata lain, perintah ditambahkan HISTFILEhingga mencapai $HISTFILESIZEgaris di titik mana, setiap baris berikutnya yang ditambahkan berarti perintah pertama file akan dihapus.

Anda dapat mengatur nilai-nilai variabel ini di ~/.profile(atau ~/.bash_profilejika file itu ada). Jangan atur mereka di ~/.bashrcpertama Anda karena mereka tidak memiliki bisnis yang ditetapkan di sana dan kedua karena itu akan menyebabkan Anda memiliki perilaku yang berbeda dalam shell login vs non-login yang dapat menyebabkan masalah lain .

Variabel berguna lainnya yang memungkinkan Anda menyesuaikan perilaku riwayat Anda adalah:

  • HISTIGNORE: Ini memungkinkan Anda untuk mengabaikan perintah umum tertentu yang jarang menarik. Misalnya, Anda dapat mengatur:

    export HISTIGNORE="pwd:df:du"

    Itu akan menyebabkan perintah apapun yang dimulai dengan pwd, dfatau duuntuk diabaikan dan tidak disimpan dalam sejarah Anda.

  • HISTCONTROL: Yang ini memungkinkan Anda memilih cara kerja histori. Secara pribadi, saya mengaturnya HISTCONTROL=ignoredupsyang menyebabkannya menyimpan perintah yang digandakan hanya sekali. Opsi lainnya adalah ignorespacemengabaikan perintah yang dimulai dengan spasi, dan erasedupsyang menyebabkan semua baris sebelumnya yang cocok dengan baris saat ini dihapus dari daftar riwayat sebelum baris itu disimpan. ignorebothadalah singkatan untuk ignorespace dan ignoredups.

  • HISTTIMEFORMAT: Ini memungkinkan Anda untuk mengatur format waktu dari file histori. Lihat jawaban Pandya atau baca man bashuntuk detailnya.


Untuk penyempurnaan lebih lanjut, Anda harus:

  • The histappendpesta pilihan. Ini dapat diatur dengan menjalankan shopt -s histappendatau menambahkan perintah itu ke ~/.bashrc. Jika opsi ini disetel

    daftar riwayat ditambahkan ke file yang dinamai dengan nilai variabel HISTFILE saat shell keluar, alih-alih menimpa file.

    Ini sangat berguna karena memungkinkan Anda untuk menggabungkan sejarah sesi yang berbeda (pikirkan terminal yang berbeda misalnya).

  • The historyperintah memiliki dua pilihan yang berguna:

    • history -a : menyebabkan perintah terakhir ditulis ke file histori secara otomatis

    • history -r : mengimpor file histori ke dalam sesi saat ini.

    Anda bisa, misalnya, menambahkan dua perintah ini ke Anda PROMPT_COMMAND(yang dieksekusi setiap kali shell Anda menampilkan prompt, jadi setiap kali Anda memulai shell baru dan setelah setiap perintah Anda jalankan di dalamnya):

    export PROMPT_COMMAND='history -a;history -r;'

    Digabungkan, mereka memastikan bahwa setiap terminal baru yang Anda buka akan segera mengimpor sejarah dari setiap sesi shell lainnya. Hasilnya adalah sejarah umum di semua terminal / sesi shell.

terdon
sumber
2

Ukuran default dari file histori adalah 500 baris. Setelah file .bash_history mencapai 500 baris, entri awal dihilangkan untuk memberi ruang bagi baris yang lebih baru, seperti di FIFO. Anda dapat mengubah ini dengan mengubah nilai variabel HISTFILESIZEyang secara default memiliki nilai 500.

Menempatkan HISTFILESIZE=10000dalam .bashrc Anda akan meningkatkan jumlah baris file sejarah dapat menampung hingga 10.000, sehingga meningkatkan umur isinya.

Cahaya kota
sumber
2
Catatan: jika Anda menaikkan HISTSIZEbatas, pertimbangkan untuk mengubah HISTFILEjuga. Jika Anda menjalankan bash --norc HISTSIZEakan kembali ke nilai default, memotong HISTFILEkeluar Anda.
llua
Terima kasih, @ llua. Demikian pula, jika sistem Anda /etc/bash.bashrcmenetapkan a HISTFILESIZE(atau mungkin HISTSIZE; Saya belum memeriksa yang mana), maka Bash tampaknya terpotong .bash_historypada titik yang dibaca /etc/bash.bashrc(atau setidaknya di beberapa titik sebelum batas baru Anda diatur dalam file init Bash Anda sendiri). Untuk menghindari ini, sekali lagi, atur sendiri HISTFILEsehingga riwayat asli Anda pergi ke sana dan tidak ke dalam .bash_historyfile yang Bash memotong.
Chris Povirk
(Tapi jangan export, karena hal itu akan membuatnya terlihat oleh kulit kerang anak, yang kemudian bisa terlihat memangkasnya sebagai gantinya .bash_history!)
Chris Povirk
0

Baca man bashuntuk detail lebih lanjut tentang sejarah bash seperti:

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 adalah
       tidak disimpan dalam daftar riwayat. Nilai diabaikannya menyebabkan garis cocok dengan sebelumnya
       entri riwayat untuk tidak disimpan. Nilai ignoreboth adalah singkatan untuk ignorespace dan
       diabaikan Nilai penghapusan menghapus semua baris sebelumnya yang cocok dengan baris saat ini
       dihapus dari daftar riwayat sebelum garis itu disimpan. Nilai apa pun tidak di atas
       daftar diabaikan. Jika HISTCONTROL tidak disetel, atau tidak menyertakan nilai yang valid, semua baris
       dibaca oleh parser shell disimpan pada daftar histori, tunduk pada nilai HISTIG -
       LEBIH BANYAK. Baris kedua dan selanjutnya dari perintah majemuk multi-baris tidak diuji,
       dan ditambahkan ke histori terlepas dari nilai HISTCONTROL.
SEJARAH
       Nama file di mana sejarah perintah disimpan (lihat SEJARAH di bawah). Default
       nilainya ~ / .bash_history. Jika tidak disetel, riwayat perintah tidak disimpan saat shell keluar.
SEJARAH
       Jumlah maksimum baris yang terkandung dalam file histori. Ketika variabel ini ditugaskan
       sebuah nilai, file histori terpotong, jika perlu, mengandung tidak lebih dari angka itu
       baris dengan menghapus entri terlama. File riwayat juga dipotong ke ukuran ini
       setelah menulisnya ketika shell keluar. Jika nilainya 0, file riwayat akan dipotong
       ukuran nol. Nilai non-numerik dan nilai numerik kurang dari nol menghambat pemotongan. Itu
       shell menetapkan nilai default ke nilai HISTSIZE setelah membaca file startup apa pun.
HISTIGNORE
       Daftar pola yang dipisahkan oleh titik dua yang digunakan untuk memutuskan baris perintah mana yang harus disimpan
       daftar sejarah. Setiap pola berlabuh di awal garis dan harus cocok
       baris lengkap (tidak ada `* 'implisit ditambahkan). Setiap pola diuji terhadap garis
       setelah pemeriksaan yang ditentukan oleh HISTCONTROL diterapkan. Selain shell yang normal
       karakter pencocokan pola, `& 'cocok dengan garis sejarah sebelumnya. `& 'mungkin lolos
       menggunakan backslash; backslash dihapus sebelum mencoba pertandingan. Yang kedua dan
       baris berikutnya dari perintah majemuk multi-baris tidak diuji, dan ditambahkan ke
       sejarah terlepas dari nilai HISTIGNORE.
KEBIJAKAN
       Jumlah perintah yang perlu diingat dalam sejarah perintah (lihat SEJARAH di bawah). Jika
       nilainya 0, perintah tidak disimpan dalam daftar riwayat. Nilai numerik kurang dari nol
       mengakibatkan setiap perintah disimpan di daftar riwayat (tidak ada batasan). Kerang
       menetapkan nilai default ke 500 setelah membaca semua file startup.
HISTTIMEFORMAT
       Jika variabel ini disetel dan bukan nol, nilainya digunakan sebagai string format untuk strftime (3)
       untuk mencetak cap waktu yang terkait dengan setiap entri riwayat yang ditampilkan oleh riwayat
       builtin. Jika variabel ini disetel, stempel waktu ditulis ke file histori sehingga mungkin
       disimpan di seluruh sesi shell. Ini menggunakan karakter komentar sejarah untuk membedakan
       guish cap waktu dari garis sejarah lainnya.

Khususnya HISTFILESIZEdan HISTSIZEsemoga Anda mencari dan membantu Anda.

Pandya
sumber