.bash_history 文件的内容会持续多长时间?

.bash_history 文件的内容会持续多长时间?

如何修改我的bash_history文件的内容?什么值或变量控制历史持续多久?我还可以更改其他任何内容来更好地控制我的 BASH 历史记录吗?

答案1

有两个变量控制历史记录大小:

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 和非登录 shell 中出现不同的行为,这可能会导致其他问题

其他允许您微调历史记录行为的有用变量包括:

  • HISTIGNORE:这使您可以忽略某些很少感兴趣的常用命令。例如,您可以设置:

    export HISTIGNORE="pwd:df:du"
    

    pwd这将导致任何以、df、 或开头的命令du被忽略并且不会保存在您的历史记录中。

  • HISTCONTROL:这个可以让你选择历史记录的运作方式。就我个人而言,我将其设置为HISTCONTROL=ignoredups使其仅保存重复的命令一次。其他选项是ignorespace忽略以空格开头的命令,erasedups这会导致在保存该行之前从历史记录列表中删除与当前行匹配的所有先前行。ignoreboth是ignorespace 和ignoredups 的简写。

  • HISTTIMEFORMAT:允许您设置历史文件的时间格式。请参阅 Pandya 的回答或阅读man bash了解详细信息。


为了进一步微调,您有:

  • bashhistappend选项。这可以通过运行shopt -s histappend该命令或将该命令添加到您的~/.bashrc.如果设置了该选项

    当 shell 退出时,历史列表将附加到由 HISTFILE 变量的值命名的文件中,而不是覆盖该文件。

    这非常有用,因为它允许您组合不同会话的历史记录(例如考虑不同的终端)。

  • history命令有两个有用的选项:

    • history -a:使最后一条命令自动写入历史文件

    • history -r:将历史文件导入到当前会话中。

    例如,您可以将这两个命令添加到您的命令中PROMPT_COMMAND(每次您的 shell 显示提示时都会执行该命令,因此每当您启动一个新 shell 以及在其中运行每个命令之后):

    export PROMPT_COMMAND='history -a;history -r;'
    

    结合起来,它们确保您打开的任何新终端都会立即导入任何其他 shell 会话的历史记录。结果是所有终端/shell 会话都有共同的历史记录。

答案2

历史文件的默认大小为 500 行。一旦 .bash_history 文件达到 500 行,早期的条目就会被消除,为较新的行腾出空间,就像 FIFO 一样。您可以通过更改HISTFILESIZE默认值为 500 的变量值来更改此设置。

在 .bashrc 中添加 aHISTFILESIZE=10000会将历史文件可以容纳的行数增加到 10000,从而延长其内容的寿命。

答案3

阅读man bash有关内容的更多详细信息巴什历史喜欢:

组织控制
       以冒号分隔的值列表,控制命令如何保存在历史列表中。
       如果值列表包含ignorespace,则以空格字符开头的行是
       未保存在历史列表中。 ignoredups 的值会导致与前一个匹配的行
       历史条目不被保存。 ignoreboth 的值是ignorespace 的简写,
       被忽略。 erasedups 的值会导致与当前行匹配的所有先前行
       在保存该行之前从历史列表中删除。任何不在上述范围内的值
       列表被忽略。如果 HISTCONTROL 未设置或不包含有效值,则所有行
       shell解析器读取的内容保存在历史列表中,取决于HISTIG的值
       不。多行复合命令的第二行和后续行未测试,
       无论 HISTCONTROL 的值如何,都会添加到历史记录中。
历史文件
       保存命令历史记录的文件的名称(请参阅下面的 HISTORY)。默认
       值为~/.bash_history。如果未设置,则 shell 退出时不会保存命令历史记录。
历史文件大小
       历史文件中包含的最大行数。当这个变量被赋值时
       一个值,如有必要,历史文件将被截断以包含不超过该数字
       通过删除最旧的条目来减少行数。历史文件也被截断为这个大小
       当 shell 退出时写入它之后。如果值为 0,则历史文件被截断为
       零尺寸。非数值和小于零的数值禁止截断。这
       shell 在读取任何启动文件后将默认值设置为 HISTSIZE 的值。
希斯蒂尼奥
       以冒号分隔的模式列表,用于决定应保存哪些命令行
       历史列表。每个模式都锚定在行的开头并且必须匹配
       完整的行(不附加隐含的“*”)。每个图案都经过线测试
       应用 HISTCONTROL 指定的检查后。除了普通的外壳外
       模式匹配字符,“&”匹配上一个历史行。 `&' 可能会被转义
       使用反斜杠;在尝试匹配之前,反斜杠被删除。第二个和
       多行复合命令的后续行不会被测试,而是被添加到
       历史记录,无论 HISTIGNORE 的值如何。
历史大小
       命令历史记录中要记住的命令数量(请参阅下面的“历史记录”)。如果
       值为0时,命令不保存在历史列表中。小于零的数值
       导致每个命令都保存在历史列表中(没有限制)。贝壳
       读取任何启动文件后将默认值设置为 500。
历史时间格式
       如果此变量已设置且不为空,则其值将用作 strftime(3) 的格式字符串
       打印与历史显示的每个历史条目关联的时间戳
       内置。如果设置了此变量,时间戳将写入历史文件,以便它们可以
       跨 shell 会话保留。这使用历史注释字符来区分
       从其他历史记录中获取时间戳。

特别HISTFILESIZEHISTSIZE愿您正在寻找并帮助您。

相关内容