bash HISTSIZE vs HISTFILESIZE?

174

Apa perbedaan HISTSIZEvs HISTFILESIZE?

Mereka digunakan untuk memperpanjang sejarah bash di luar 500 baris default.

Tampaknya tidak ada kejelasan di sini dan di forum lain tentang mengapa keduanya dibutuhkan. ( Contoh 1 , Contoh 2 , Contoh 3 ).

arturomp
sumber

Jawaban:

289

Jawaban singkat:

HISTSIZE adalah jumlah baris atau perintah yang disimpan dalam memori dalam daftar riwayat saat sesi bash Anda sedang berlangsung.

HISTFILESIZE adalah jumlah baris atau perintah yang (a) diizinkan dalam file histori pada saat permulaan sesi, dan (b) disimpan dalam file histori pada akhir sesi bash Anda untuk digunakan pada sesi berikutnya.

Perhatikan perbedaan antara file: pada disk - dan list: dalam memori.

Jawaban panjang:

Semua info di atas + beberapa contoh:

Contoh 1 : HISTFILESIZE=10danHISTSIZE=10

  1. Anda memulai sesi Anda.
  2. HISTFILE Anda (file yang menyimpan riwayat perintah bash Anda), dipotong untuk berisi HISTFILESIZE = 10 baris.
  3. Anda menulis 50 baris.
  4. Pada akhir 50 perintah Anda, hanya perintah 41 hingga 50 yang ada dalam daftar riwayat Anda, yang ukurannya ditentukan oleh HISTSIZE = 10.
  5. Anda mengakhiri sesi Anda.
  6. Dengan asumsi histappendtidak diaktifkan, perintah 41 hingga 50 disimpan ke HISTFILE Anda yang sekarang memiliki 10 perintah yang dipegang di awal ditambah 10 perintah yang baru ditulis.
  7. HISTFILE Anda dipotong mengandung HISTFILESIZE = 10 baris.
  8. Anda sekarang memiliki 10 perintah dalam riwayat Anda - 10 perintah terakhir yang baru saja Anda ketik di sesi yang baru saja selesai.
  9. Ketika Anda memulai sesi baru, Anda memulai dari 1 dengan SEJARAH HISTFILESIZE = 10.

Contoh 2 : HISTFILESIZE=10danHISTSIZE=5

  1. Anda memulai sesi Anda.
  2. HISTFILE Anda (file yang menyimpan riwayat perintah bash Anda), dipotong untuk berisi paling banyak HISTFILESIZE = 10 baris.
  3. Anda menulis 50 baris.
  4. Pada akhir 50 perintah Anda, hanya perintah 46 hingga 50 yang ada dalam daftar riwayat Anda, yang ukurannya ditentukan oleh HISTSIZE = 5.
  5. Anda mengakhiri sesi Anda.
  6. Dengan asumsi histappendtidak diaktifkan, perintah 46 hingga 50 disimpan ke HISTFILE Anda yang sekarang memiliki 10 perintah yang dipegang di awal ditambah 5 perintah yang baru ditulis.
  7. HISTFILE Anda dipotong mengandung HISTFILESIZE = 10 baris.
  8. Anda sekarang memiliki 10 perintah dalam riwayat Anda - 5 dari sesi sebelumnya dan 5 terakhir yang baru saja Anda ketik di sesi yang baru saja selesai.
  9. Ketika Anda memulai sesi baru, Anda memulai dari 1 dengan SEJARAH HISTFILESIZE = 10.

Contoh 3 : HISTFILESIZE=5danHISTSIZE=10

  1. Anda memulai sesi Anda.
  2. HISTFILE Anda (file yang menyimpan histori perintah bash Anda), dipotong untuk berisi paling banyak HISTFILESIZE = 5 baris.
  3. Anda menulis 50 baris.
  4. Pada akhir 50 perintah Anda, hanya perintah 41 hingga 50 yang ada dalam daftar riwayat Anda, yang ukurannya ditentukan oleh HISTSIZE = 10.
  5. Anda mengakhiri sesi Anda.
  6. Dengan asumsi histappendtidak diaktifkan, perintah 41 hingga 50 disimpan ke HISTFILE Anda yang sekarang memiliki 5 perintah yang dipegang di awal ditambah 10 perintah yang baru ditulis.
  7. HISTFILE Anda dipotong mengandung HISTFILESIZE = 5 baris.
  8. Anda sekarang memiliki 5 perintah dalam riwayat Anda - 5 perintah terakhir yang baru saja Anda ketik di sesi yang baru saja selesai.
  9. Ketika Anda memulai sesi baru, Anda memulai lagi pada langkah 1 dengan SEJARAH HISTFILESIZE = 5.

Info dari elixir_sinari :

"File" riwayat tidak diperbarui saat Anda mengetik perintah. Perintah-perintah disimpan dalam "daftar" secara terpisah (diakses oleh perintah sejarah). Jumlah perintah yang disimpan ini dikendalikan oleh nilai HISTSIZE. Ketika shell (interaktif) keluar, baris $ HISTSIZE terakhir disalin / ditambahkan ke $ HISTFILE dari "daftar" itu. Jika HISTFILESIZE diset, maka setelah operasi ini, dipastikan hanya $ HISTFILESIZE baris (terbaru) yang ada di $ HISTFILE. Dan ketika shell dimulai, "daftar" diinisialisasi dari $ HISTFILE hingga maksimum $ HISTSIZE perintah.

Dan dari man bashhalaman:

Nilai variabel HISTSIZE digunakan sebagai jumlah perintah untuk disimpan dalam daftar riwayat. Teks dari perintah HISTSIZE terakhir (default 500) disimpan. (...)

Pada startup, histori diinisialisasi dari file yang dinamai oleh variabel HISTFILE (default ~ / .bash_history). File yang dinamai dengan nilai HISTFILE dipotong, jika perlu, mengandung tidak lebih dari jumlah baris yang ditentukan oleh nilai HISTFILESIZE. (...) Ketika shell interaktif keluar, $ HISTSIZE baris terakhir disalin dari daftar riwayat ke $ HISTFILE. 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. Jika HISTFILE tidak disetel, atau jika file histori tidak dapat ditulis, histori tidak disimpan. (...) Setelah menyimpan histori, file histori dipotong agar tidak lebih dari baris HISTFILESIZE. Jika HISTFILESIZE tidak disetel,

arturomp
sumber
27
+1 Jawaban ini mengesankan menyeluruh! Tapi agak terlalu banyak, saya pikir. Kebanyakan orang tidak akan mencapai akhirnya. Saya pikir Anda harus mempertimbangkan untuk meringkasnya
slezica
22
@slezica Saya tidak setuju dengan bagian kedua dari komentar Anda: Saya mencapai bagian akhir dan saya dapat mengatakan bahwa setiap bit informasi dalam jawabannya bermanfaat. Fakta bahwa beberapa orang terlalu malas untuk membaca beberapa baris tidak seharusnya membenarkan menghapus informasi yang bermanfaat untuk yang lain.
Bastien
1
@ Bastien dengan asumsi Anda adalah parser poin-peluru, Anda tidak akan kesulitan membaca ini.
Pithikos
6
Lihat, hard drive saya adalah 1 TB dan sebagian besar kosong, dan saya memiliki sekumpulan siklus CPU dan RAM yang menganggur, dan saya ingin menyimpan sebanyak mungkin bash history - jadi ketika saya perlu mencari perintah bodoh itu saya tidak perlu t berjalan dalam dua tahun, saya tahu itu dalam sejarah bash saya. Untuk membuatnya lebih konkret, katakanlah hingga 50 MB sejarah bash. Nilai apa yang Anda rekomendasikan?
CivFan
2
@ Matius maaf, tidak tahu itu!
arturomp
6

Membangun di atas apa yang dikatakan arturomp dan dalam upaya membuatnya sedikit lebih jelas.

Dengan asumsi Anda memiliki sejarah panjang 2000-an ..

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

Anda dapat mengurangi dengan apa Anda ditampilkan HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

Sekarang, tidak peduli berapa banyak perintah yang Anda ketikkan, hanya 5 perintah terakhir yang akan dicatat.

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

Kita dapat dengan jelas melihat bahwa perintah pertama kita ("ABC") tidak ada dalam sejarah karena hanya 5 perintah terakhir yang dicatat.

Sekarang, total history disimpan dalam file ( .bash_history) dan Anda dapat mengubah berapa lama file ini didapat dengan HISTFILESIZE. Misalnya dengan 2033 HISTFILESIZE, dalam kasus saya, saya akan memiliki ini:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD
Pithikos
sumber
3
Nilai apa yang akan Anda rekomendasikan jika saya ingin semua histori dari semua terminal bersamaan disimpan ke bash history, selamanya ? Dengan kata lain, simpan semuanya, selalu, dan jangan pernah menghapus apa pun.
CivFan
10
@CivFan: Setel HISTSIZE=-1dan HISTFILESIZE=-1.
M. Dudley
2
Ini salah besar. Mengaturnya ke -1 akan menghapus semuanya.
Brendan Byrd
3
@ BrendanByrd bashHalaman manual mengatakan: Non-numeric values and numeric values less than zero inhibit truncationtapi kemudian saya tidak punya keberanian untuk memeriksa apakah ini benar karena saya tidak ingin kehilangan sejarah saya :-)
SebMa
3
@SebMa Saya mengubah pengaturan saya ke HISTSIZE='INFINITY'dan HISTFILESIZE='ANDBEYOND'. Karena mereka bukan angka, mereka menyimpan semuanya. Terima kasih atas tipnya!
Connor