Bash

.bash_history 文件的內容能保存多久?

  • December 11, 2014

如何修改bash_history文件的內容?哪些值或變數控制著歷史的持續時間?我是否可以更改任何其他內容以更好地控制我的 BASH 歷史記錄?

有兩個變數控制歷史大小:

HISTFILESIZE 歷史文件中包含的最大行數。當這個變數被賦值時,如果需要,歷史文件被截斷,通過刪除最舊的條目來包含不超過該數量的行。當 shell 退出時,歷史文件在寫入後也會被截斷為這個大小。如果值為 0,則歷史文件被截斷為零大小。非數值和小於零的數值禁止截斷。shell 在讀取任何啟動文件後將預設值設置為 HISTSIZE 的值。

HISTSIZE 命令歷史記錄中要記住的命令數量(請參閱下面的歷史記錄)。如果值為 0,則命令不保存在歷史列表中。小於零的數值會導致每個命令都保存在歷史列表中(沒有限制)。讀取任何啟動文件後,shell 將預設值設置為 500。

這兩個變數允許您控制歷史記錄的行為。基本上,HISTSIZE是目前會話期間保存的命令HISTFILESIZE數,並且是跨會話記住的命令數。因此,例如:

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

在上面的範例中,因為HISTSIZE設置為 10,所以history返回 10 個命令的列表。但是,如果您註銷然後重新登錄,history將僅返回 5 個命令,因為HISTFILESIZE設置為 5。這是因為,一旦您退出會話,您HISTFILESIZE的歷史記錄行將保存到您的歷史記錄文件中(~/.bash_history預設情況下但由HISTFILE)。換句話說,添加命令HISTFILE直到到達$HISTFILESIZE該點的行,隨後添加的每一行都意味著將刪除文件的第一個命令。

~/.profile您可以在您的(或者~/.bash_profile如果該文件存在)中設置這些變數的值。不要在你的~/.bashrc第一個設置它們,因為它們沒有在那裡設置業務,其次因為這會導致你在登錄和非登錄 shell 中有不同的行為,這可能會導致其他問題

允許您微調歷史行為的其他有用變數是:

  • HISTIGNORE:這使您可以忽略某些很少感興趣的常用命令。例如,您可以設置:
export HISTIGNORE="pwd:df:du"

pwd這將導致任何以,df或開頭的命令du被忽略並且不會保存在您的歷史記錄中。

  • HISTCONTROL:這個讓您選擇歷史的運作方式。就個人而言,我將其設置為HISTCONTROL=ignoredups僅保存一次重複的命令。其他選項是ignorespace忽略以空格開頭的命令,erasedups這會導致在保存該行之前從歷史列表中刪除與目前行匹配的所有先前行。ignoreboth是ignorespace 和ignoreups 的簡寫。
  • HISTTIMEFORMAT:這允許您設置歷史文件的時間格式。請參閱 Pandya 的答案或閱讀man bash以了解詳細資訊。

為了進一步微調,您有:

  • histappendbash 選項。這可以通過執行shopt -s histappend或將該命令添加到您的~/.bashrc. 如果設置了此選項

當 shell 退出時,歷史列表會附加到由 HISTFILE 變數的值命名的文件中,而不是覆蓋該文件。

這非常有用,因為它允許您組合不同會話的歷史記錄(例如考慮不同的終端)。

  • history命令有兩個有用的選項:

    • history -a: 使最後一條命令自動寫入歷史文件
    • history -r: 將歷史文件導入目前會話。例如,您可以將這兩個命令添加到您的PROMPT_COMMAND(每次您的 shell 顯示提示時執行,因此每當您啟動一個新的 shell 並在每個命令之後執行它):
export PROMPT_COMMAND='history -a;history -r;'

結合起來,它們確保您打開的任何新終端將立即導入任何其他 shell 會話的歷史記錄。結果是所有終端/shell會話的共同歷史。

引用自:https://unix.stackexchange.com/questions/163371