題 如何:無限的Bash / shell歷史記錄?


有沒有辦法在Bash中定義無限的歷史?


75
2018-05-04 12:01


起源




答案:


把它放到.bashrc中:

export HISTFILESIZE=
export HISTSIZE=

你去,無限的歷史。目前我有27000個條目:)

來自“man bash”:

如果 HISTFILESIZE 未設置,不執行截斷。

這意味著.bash_history永遠不會被截斷

同樣似乎適用於HISTSIZE,雖然我無法找到記錄。

我要嘗試的另一個簡潔的功能是:

如果 HISTTIMEFORMAT 如果設置了變量,時間戳將寫入歷史文件,並使用歷史註釋字符標記,因此可以跨shell會話保留它們。

如果你已經嘗試過,請告訴我......


74
2017-07-22 09:45



這實際上並不適用於許多情況,並且bash歷史記錄仍然會被截斷。請參閱下面的答案以獲得更完整的解決方案。 - fotinakis
警告:這會引起頭痛 gdb;如果你設置了 HISTSIZE 變量將它作為0,從而完全禁用歷史大小。 - Matteo Italia
注意:你不需要 export, HISTFILESIZE 是行數(不是字節)和歷史文件 設置變量時會發生截斷  HISTFILESIZE (當shell退出時)。所以不要在配置文件中使用不同的值設置兩次... - vaab
@vaab:如果我不導出HISTFILE,我無法看到我的histfile在子shell中使用“echo $ HISTFILE”,所以雖然沒有必要,但它可以是有用的,並且沒有任何傷害我可以檢測到。 - Jeff Learman


(轉發我的答案 https://stackoverflow.com/a/19533853/128597

經過多年來的許多大型,醜陋的迭代和奇怪的邊緣情況,我現在有一個簡潔的部分 我的.bashrc 致力於此。

首先,你必須註釋掉或 刪除.bashrc的此部分 (Ubuntu的默認值)。如果你不這樣做,那麼某些環境(比如跑步) screen 會話)仍然會截斷你的歷史記錄:

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

第二, 加上這個 到.bashrc的底部:

# 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"

注意:每個命令在運行後立即寫入,因此如果您不小心粘貼了密碼,您不能只是“殺死-9 %%”以避免歷史記錄寫入,您需要手動刪除它。

另請注意,每個bash會話都會將完整的歷史文件加載到內存中,但即使您的歷史文件增長到10MB(這將需要一個 很久很久 時間)你不會注意到你的bash啟動時間有多大影響。


37
2017-10-23 06:20



設置時,歷史文件會被截斷 HISTFILESIZE,這就是為什麼除了你想要的事件之外你應該刪除這種事件的任何事件。它也將在shell退出時被截斷(但這是預期的)。你不應該需要 export。 - vaab
@vaab如果你不出口,做類似的事情 bash --norc 將再次截斷歷史。 - Yongwei Wu
我用 export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`" 保持每個會話的shell歷史記錄(基於主機名和tty名稱)。當然我必須首先創建〜/ hist目錄。 - Jeff Learman
請注意,您可能需要檢查PROMPT_COMMAND的值,而不是盲目地追加它,因為它會對您的系統做出瘋狂的事情。空檢查或更好的shell變量擴展搜索可能更安全。 - dragon788
我用這個來避免@ dragon788引用的問題: PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a"; - Brian Vandenberg


包括 在〜/ .bashrc

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

此答案滿足以下條件:

  1. 單獨的主歷史記錄(沒有會話可以中斷您的歷史記錄)

  2. 自動歷史寫作(沒有熱鍵)

  3. 不頻繁的寫入(每個命令後沒有附加)

背景

在互動啟動時,如果 $HISTFILESIZE 設置為數字,bash截斷 $HISTFILE 那個數字。在交互式關閉時,如果是shell選項 histappend 設置,bash追加 $HISTSIZE 線到 $HISTFILE否則會覆蓋 $HISTFILE

OSX(終端)的提示

每次在終端中創建選項卡時, ~/.bash_profile 被讀取,這意味著bash不會繼續閱讀你的 ~/.bashrc。將以下行添加到您的 ~/etc/bash_profile

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

屏幕提示

如果使用screen,則配置文件為〜/ .screenrc。如果您希望屏幕記錄歷史記錄,您只需將其設置為使用登錄shell,它將獲取您的bash啟動文件(並記錄您的歷史記錄)。

# use bash, make it a login shell
defshell -bash

8
2018-03-22 19:47





一個不同的概念(可能不適用),但你可以擁有 unlimited 使用歷史 殼沉


3
2018-05-04 12:35