每个用户的家目录中都有一个文件来保存会话中的命令行历史(默认为~/.bash_history
,但由HISTFILE
控制),当一个会话结束之后,就会根据命令行history的Size把该会话中的命令保存在命令行历史文件中。
那么如何控制它的大小?
有两个变量在控制命令行历史的大小:
- HISTFILESIZE
HISTFILESIZE The maximum number of lines contained in the history file. When this variable is assigned a value, the history file is truncated, if necessary, to contain no more than that number of lines by removing the oldest entries. The history file is also truncated to this size after writing it when a shell exits. If the value is 0, the history file is truncated to zero size. Non-numeric values and numeric values less than zero inhibit truncation. The shell sets the default value to the value of HISTSIZE after reading any startup files.
HISTFILESIZE 历史文件中包含的最大行数。 当这个变量被赋值时,如果需要,历史文件被截断,通过删除最旧的条目来包含不超过该数量的行。 当 shell 退出时,历史文件在写入后也会被截断为这个大小。 如果值为 0,则历史文件被截断为零大小。 非数值和小于零的数值禁止截断。 shell 在读取任何启动文件后将默认值设置为 HISTSIZE 的值。
- HISTSIZE
HISTSIZE The number of commands to remember in the command history (see HISTORY below). If the value is 0, commands are not saved in the history list. Numeric values less than zero result in every command being saved on the history list (there is no limit). The shell sets the default value to 500 after reading any startup files.
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
: 这允许您设置历史文件的时间格式(这个还是挺有用的)。
为了进一步微调,您有:
-
histappend
bash 选项。 这可以通过运行shopt -s histappend
或将该命令添加到您的~/.bashrc
来设置。 如果设置了此选项当 shell 退出时,历史列表会附加到由 HISTFILE 变量的值命名的文件中,而不是覆盖该文件。
这非常有用,因为它允许您组合不同会话的历史记录(例如考虑不同的终端)。
-
history
命令有两个有用的选项:history -a
: 使最后一条命令自动写入历史文件history -r
: 将历史文件导入当前会话
例如,您可以将这两个命令添加到您的 PROMPT_COMMAND
中(每次您的 shell 显示提示时都会执行此命令,因此每当您启动一个新的 shell 并在您在其中运行的每个命令之后):
export PROMPT_COMMAND='history -a;history -r;'
结合起来,它们确保您打开的任何新终端将立即导入任何其他 shell 会话的历史记录。 结果是所有终端/shell会话的共同历史。