.bash_history 文件的内容持续多久?

13 bash environment-variables bashrc

如何修改我的bash_history文件的内容?什么值或变量控制历史的持续时间?是否还有其他什么我可以更改以更好地控制我的 BASH 历史记录?

ter*_*don 12

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

HISTFILESIZE 历史文件中包含的最大行数。当这个变量被赋值时,如果有必要,历史文件被截断,通过删除最旧的条目来包含不超过该数量的行。历史文件在 shell 退出时写入后也会被截断到这个大小。如果值为 0,则历史文件将被截断为零大小。非数字值和小于零的数字值禁止截断。在读取任何启动文件后,shell 将默认值设置为 HISTSIZE 的值。

HISTSIZE 命令历史记录中要记住的命令数(参见下面的 HISTORY)。如果值为 0,则命令不会保存在历史列表中。小于零的数值会导致每个命令都保存在历史列表中(没有限制)。在读取任何启动文件后,shell 将默认值设置为 500。

这两个变量允许您控制历史记录的行为。基本上,HISTSIZE是当前会话期间保存的命令HISTFILESIZE数,是跨会话将记住的命令数。因此,例如:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,因为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"
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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


为了进一步微调,您有:

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

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

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

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

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

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

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

    export PROMPT_COMMAND='history -a;history -r;'
    
    Run Code Online (Sandbox Code Playgroud)

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