Bagaimana cara: Riwayat Bash / shell yang tidak terbatas?

83

Apakah ada cara untuk mendefinisikan riwayat tanpa batas di Bash?

Drago
sumber

Jawaban:

82

Tambahkan ini ke .bashrc(Linux) atau .bash_profile(MacOS) Anda:

export HISTFILESIZE=
export HISTSIZE=

Ini dia, sejarah tanpa batas. Saat ini saya punya 27.000 entri :)

Dari man bash:

Jika HISTFILESIZEtidak disetel, tidak ada pemotongan yang dilakukan.

Itu berarti .bash_historytidak pernah terpotong

Hal yang sama tampaknya berlaku untuk HISTSIZE, meskipun saya tidak dapat menemukan yang didokumentasikan.

Fitur rapi lain yang akan saya coba adalah ini:

Jika HISTTIMEFORMATvariabel disetel, stempel waktu ditulis ke file riwayat, ditandai dengan karakter komentar riwayat, sehingga mereka dapat disimpan di seluruh sesi shell, seperti berikut:

export HISTTIMEFORMAT="%F %T "

Beri tahu saya jika Anda sudah mencobanya ...

morgenrot
sumber
3
Ini sebenarnya tidak berfungsi untuk banyak kasus dan sejarah bash masih terpotong. Lihat jawaban saya di bawah ini untuk solusi yang lebih lengkap.
fotinakis
2
Peringatan: ini menyebabkan sakit kepala dengan gdb; jika Anda menetapkan HISTSIZEvariabel, variabel itu akan dianggap sebagai 0, sehingga menonaktifkan ukuran histori seluruhnya.
Matteo Italia
2
Catatan: Anda tidak perlu export, HISTFILESIZEada dalam jumlah baris (bukan byte), dan pemotongan file riwayat terjadi ketika Anda mengatur variabelHISTFILESIZE (dan ketika shell keluar). Jadi jangan atur dua kali dalam file konfigurasi Anda dengan nilai yang berbeda ...
vaab
@vaab: jika saya tidak mengekspor HISTFILE, saya tidak bisa melihat apa histfile saya menggunakan "echo $ HISTFILE" dalam subkulit, jadi sementara itu tidak perlu, itu bisa membantu dan tidak ada salahnya saya dapat mendeteksi.
Jeff Learman
41

(pengeposan jawaban saya dari https://stackoverflow.com/a/19533853/128597 )

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

Pertama, Anda harus berkomentar 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".
# https://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
4
File histori akan terpotong ketika Anda mengatur HISTFILESIZE, ini sebabnya Anda harus menghapus kejadian seperti itu kecuali yang Anda inginkan. Ini juga akan terpotong pada shell exit (tapi itu diharapkan). Dan Anda seharusnya tidak perlu export.
vaab
3
@vaab Jika Anda tidak mengekspor, melakukan sesuatu seperti bash --norcakan memotong sejarah lagi.
Yongwei Wu
1
Saya menggunakan export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"untuk menjaga riwayat shell terpisah per sesi (berdasarkan nama host dan nama tty). Tentu saja saya harus membuat direktori ~ / hist terlebih dahulu.
Jeff Learman
2
Perhatikan bahwa Anda mungkin ingin memeriksa nilai PROMPT_COMMAND dan tidak membabi buta menambahkan ini berulang kali karena akan melakukan hal-hal gila pada sistem Anda. Pemeriksaan nol atau lebih baik lagi namun pencarian ekspansi variabel shell mungkin lebih aman.
dragon788
3
Saya menggunakan ini untuk menghindari masalah @ dragon788 disebut:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg
9

Sertakan dalam ~ / .bashrc :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

Jawaban ini memenuhi kriteria berikut:

  1. riwayat master terpisah (tidak ada sesi yang dapat mengganggu riwayat Anda)

  2. penulisan riwayat otomatis (tidak ada tombol cepat)

  3. tulisan jarang (tidak ada penambahan setelah setiap perintah)

Latar Belakang

Pada startup interaktif, jika $HISTFILESIZEdiatur ke angka, bash memotong $HISTFILEke nomor itu. Pada penutupan interaktif, jika opsi shell histappenddiset, bash menambahkan $HISTSIZEbaris $HISTFILE, jika tidak maka akan ditimpa $HISTFILE.

tips untuk OSX (Terminal)

Setiap kali sebuah tab dibuat di Terminal, ~/.bash_profiledibaca, yang berarti bash tidak melanjutkan untuk membaca Anda ~/.bashrc. Tambahkan baris berikut ke Anda ~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

tips untuk layar

Jika Anda menggunakan layar, file konfigurasi Anda adalah ~ / .screenrc. Jika Anda ingin layar merekam riwayat, Anda hanya perlu mengaturnya untuk menggunakan shell login yang akan sumber file startup bash Anda (dan merekam riwayat Anda).

# use bash, make it a login shell
defshell -bash
cdosborn
sumber
3

Konsep yang berbeda (mungkin tidak dapat diterapkan) tetapi Anda dapat memiliki unlimitedriwayat saat menggunakan shell-sink .

ChristopheD
sumber