Riwayat Bash Tanpa Batas [ditutup]

350

Saya ingin .bash_historyfile saya menjadi tidak terbatas. mis. Jadi saya selalu bisa kembali dan melihat bagaimana saya membangun / mengkonfigurasi sesuatu, atau apa itu perintah bagus, atau bagaimana beberapa perintah memecahkan sesuatu minggu yang lalu. Bagaimana cara mengubah pengaturan ini?

Francis Haart
sumber
1
Bash adalah bahasa pemrograman dan ini bukan tentang pemrograman?
NeilG

Jawaban:

307

Setel HISTSIZEdan HISTFILESIZEdalam .bashrc ke string kosong:

HISTSIZE= 
HISTFILESIZE=

Di bash 4.3 dan yang lebih baru, Anda juga dapat menggunakan HISTSIZE=-1 HISTFILESIZE=-1:

n.  Setting HISTSIZE to a value less than zero causes the history list to be
    unlimited (setting it 0 zero disables the history list).

o.  Setting HISTFILESIZE to a value less than zero causes the history file size
    to be unlimited (setting it to 0 causes the history file to be truncated
    to zero size).
Lri
sumber
12
(ekspor PROMPT_COMMAND = 'history -a') dapat segera menghapus perintah untuk mem-bash history.
cruelcage
3
Menyetel HISTSIZE= HISTFILESIZE=hasil dalam sepenuhnya menonaktifkan riwayat bash, setidaknya untuk saya.
Philipp Ludwig
5
Pengaturan @PhilippLudwig HISTSIZE=-1 HISTFILESIZE=-1menonaktifkan riwayat saya, saat HISTSIZE= HISTFILESIZE=melakukan trik. CentOS 7 di sini.
Seether
1
@ PhilhippLudwig Saya pikir daripada HISTSIZE= HISTFILESIZE=Anda harusexport HISTSIZE= export HISTFILESIZE=
Matzz
3
@ Seeter Jawabannya jelas menyatakan "Dalam bash 4.3 dan kemudian ...". CentOS 7 memiliki bash 4.2.x.
villapx
426

Setelah banyak, iterasi jelek dan kasus tepi aneh selama bertahun-tahun, saya sekarang memiliki bagian singkat dari .bashrc saya didedikasikan untuk ini.

Pertama, Anda harus mengomentari atau menghapus bagian .bashrc Anda (default untuk Ubuntu) Jika tidak, maka lingkungan tertentu (seperti screensesi lari ) masih akan memotong riwayat Anda:

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

Kedua, tambahkan ini ke bagian bawah .bashrc Anda:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# http://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Catatan: setiap perintah ditulis segera setelah dijalankan, jadi jika Anda secara tidak sengaja menempelkan kata sandi, Anda tidak bisa hanya "membunuh -9 %%" untuk menghindari penulisan riwayat, Anda harus menghapusnya secara manual.

Perhatikan juga bahwa setiap sesi bash akan memuat file histori lengkap dalam memori, tetapi bahkan jika file histori Anda tumbuh hingga 10MB (yang akan memakan waktu yang sangat lama ) Anda tidak akan melihat banyak efek pada waktu startup bash Anda.

fotinakis
sumber
1
@AquariusPower - Coba apa yang tepat di atas, buat HISTFILESIZE=dan kosongkan HISTSIZE=daripada -1, dan pastikan Anda tidak memiliki deklarasi lain dari param tersebut di .bashrc atau .bash_profile atau .profile.
fotinakis
2
biang kerok di .bashrc, saya punya setup setelah pada file lain dimuat oleh .bashrc ..., sekarang bekerja! Terima kasih!
Aquarius Power
10
Tambahkan dalam sistem bash standar saya, dan menambahkan riwayat saat ini juga bagus, jadi setelah konfigurasi, jalankancat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meillaud
2
Untuk menyimpan riwayat riwayat, inisialisasi file riwayat dengan riwayat Anda saat ini.
Arthur
3
Banyak terima kasih - fakta bahwa pengaturan HISTFILESIZE(dan mungkin HISTSIZE) akan segera berlaku tidak dapat terlalu ditekankan .
Attie
37

Seperti yang dikatakan Jörg Beyer di atas, HISTSIZEdan HISTFILESIZEmerupakan kuncinya.

Selain itu, Anda harus pasti memeriksa variabel lingkungan HISTCONTROL, yang memungkinkan Anda melakukan hal-hal keren seperti tidak menyimpan perintah sejarah duplikat ( HISTCONTROL=erasedups). Tidak ada gunanya memiliki riwayat tanpa batas jika Anda harus menelusuri ratusan baris cd ..atau serupa.

Tautan: di sini , dan bekerja dengan sejarah bash . FAQ Variabel bash juga layak untuk dijelajahi .

simont
sumber
13
Baris-baris cd memberi Anda konteks untuk perintah yang dikeluarkan. Mereka sebenarnya sangat berguna. Saya tidak bisa mengerti mengapa ada orang yang ingin menghapusnya, kecuali satu-satunya cara Anda menggunakan riwayat adalah dengan menelusurinya satu per satu.
iconoclast
@simont Saya juga menggunakan opsi ignorespace dengan HISTCONTROL kemudian gunakan ini untuk apa pun yang saya tidak ingin ditulis ke riwayat, seperti kata sandi.
bigtunacan
6
Menjaga garis agar tetap sangat berguna jika Anda menggunakan kembali urutan perintah. Misalnya Ctrl-rsomechars Ctrl-o Ctrl-o Ctrl-o Ctrl-o. Itu sebabnya saya menyimpan duplikat dalam sejarah.
Stéphane Gourichon
1
@ StéphaneGourichon untuk apa Ctrl-o?
Ciprian Tomoiagă
4
@ CiprianTomoiagă Ctrl-omenjalankan perintah saat diminta dan segera menunjukkan perintah setelah sebelumnya dalam sejarah. Satu manfaat adalah bahwa setelah menggunakan Ctrl-runtuk menemukan perintah lama (mungkin menggunakan panah atas dan bawah untuk pindah ke perintah tetangga dalam sejarah), cukup untuk terus Ctrlditekan dan tekan obeberapa kali untuk menjalankan lagi serangkaian perintah sebelumnya, bahkan dalam loop tak terbatas jika kamu mau. Lihat juga GNU Readline - Wikipedia
Stéphane Gourichon
22

Ada (setidaknya) dua vars yang relevan di sini:

  • HISTSIZE: jumlah entri dalam file histori
  • HISTFILESIZE: jumlah baris dalam file histori

Saya pikir kita dapat menyetujui bahwa istilah tidak terbatas seringkali sama dengan sangat besar (atau apakah Anda memiliki penyimpanan file tanpa batas?). Jadi atur saja nilainya sangat besar.

Jörg Beyer
sumber
23
"Perlu dicatat bahwa 1000000000 hanya sama dengan tak terhingga untuk nilai infinity yang sangat kecil. - sepp2k" lol. ya, saya puas dengan nilai kecil tak terbatas (katakanlah, satu bulan penggunaan terminal yang sering).
Francis Haart
6
satu bulan penggunaan terminal yang sering adalah fraksi kecil tanpa batas yang sangat kecil. Saya akan mengatakan seumur hidup sering menggunakan terminal setara dengan nilai infinity yang sangat sangat sangat kecil. Tetapi penggunaan terminal seumur hidup cukup baik untuk sejarah shell saya. ;)
iconoclast
2
Versi zsh yang lebih lama setidaknya akan macet jika Anda mengatur HISTSIZE dan / atau HISTFILESIZE terlalu besar karena mencoba untuk mengalokasikan memori yang cukup. Ini menjadi relevan ketika menjalankan alat yang menggunakan zsh sebagai cangkang mereka (dbx misalnya).
Brian Vandenberg