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


11

如何修改bash_history文件内容?哪些值或变量控制历史持续多长时间?我可以更改其他任何内容以更好地控制BASH历史记录吗?



2
我认为此文件不受时间长度的控制,而是文件的最终大小。请参阅此处:是否可以将bash中历史记录列表的大小设置为5000行以上?。因此,环境。变量,HISTSIZE并且HISTFILESIZE是您必须控制要维护多少历史记录的唯一控制平面。
slm

Answers:


12

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

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

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

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

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

在上面的示例中,因为HISTSIZE设置为10,所以history返回10个命令的列表。但是,如果您注销然后再登录,history由于HISTFILESIZE设置为5 ,将仅返回5个命令。这是因为,一旦退出会话,HISTFILESIZE历史记录的行将保存到历史记录文件中(~/.bash_history默认情况下,但受HISTFILE)。换句话说,将命令添加到行,HISTFILE直到到达$HISTFILESIZE该行为止,随后添加的每一行都将删除文件的第一个命令。

您可以在您的文件中~/.profile(或~/.bash_profile如果该文件存在)设置这些变量的值。首先不要设置它们,~/.bashrc因为在那里没有设置任何业务,其次是因为这将导致您在登录Shell和非登录Shell中具有不同的行为,这可能导致其他问题

其他使您可以微调历史记录行为的有用变量是:

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

    export HISTIGNORE="pwd:df:du"

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

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

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


为了进行进一步的微调,您可以:

  • histappendbash的选项。可以通过运行shopt -s histappend该命令或将其添加到来设置~/.bashrc。如果设置此选项

    当外壳退出时,历史记录列表将附加到由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 的变量的值来更改此设置。

HISTFILESIZE=10000.bashrc放入.bashrc会将历史记录文件可容纳的行数增加到10000,从而延长其内容的寿命。


2
注意:如果您确实提高了HISTSIZE限制,请考虑也进行更改HISTFILE。如果运行,bash --norc HISTSIZE将返回默认值,并HISTFILE在退出时截断。
llua 2014年

谢谢,@ llua。同样,如果您的系统/etc/bash.bashrc设置了一个HISTFILESIZE(或可能HISTSIZE;我没有检查哪个),那么Bash似乎会.bash_history在其读取时/etc/bash.bashrc(或至少在您自己的Bash初始化文件中设置新限制之前的某个时间)截断。为避免这种情况,请再次设置自己的位置,HISTFILE以便您的真实历史记录可以记录在这里,而不是放入.bash_historyBash正在截断的文件中。
克里斯·波维尔克

(但是不要这样做export,因为这样做会使所有子shell都可以看到它,然后可以截断它而不是.bash_history!)
Chris Povirk

0

阅读man bash以获取有关bash历史记录的更多详细信息,例如:

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

特别是HISTFILESIZEHISTSIZE也许您正在寻找并为您提供帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.