Contents

Bash 历史变量HISTSIZE与HISTFILESIZE

1.概述

在本教程中,我们将了解 Bash HISTFILESIZEHISTSIZE 变量的重要性。我们还将检查它们的默认值以及它们的不同之处。

2. Bash 历史及其默认行为

当 Bash shell 在用户登录时以交互方式加载时,它会将历史文件的内容读入内存。在 shell 会话期间,它将内容添加到 history 的内存副本中

当我们在终端上执行history 命令时,Bash 会读取内存中的副本以显示已执行命令的历史记录。最后,当 shell 退出时,它会将内存中的内容写回到磁盘上HISTFILE环境变量指向的文件中。

默认情况下,内容存储在位于用户主目录的*.bash_history*文件中:

$ echo $HISTFILE
/home/shubh/.bash_history

历史文件中可以存储的行数由两个特殊变量HISTSIZEHISTFILESIZE控制。

3. HISTSIZEHISTFILESIZE变量

HISTSIZE变量中设置的值是我们可以在内存中存储的最大历史行数。让我们从检查变量的默认值开始:

$ echo $HISTSIZE
500

这意味着默认情况下,对于给定的 Bash 会话,我们最多可以在历史记录中存储 500 行。

为了更好地理解这些概念,让我们进行一些实验:

$ HISTSIZE=3
$ echo $HISTSIZE
3

我们已将变量设置为仅在内存中保存 3 条记录。让我们通过执行  历史命令来验证:

$ history
 1502  HISTSIZE=3
 1503  echo $HISTSIZE
 1504  history

让我们通过执行更多命令来进一步检查行为:

$ echo "Let's add a record to history"
Let's add a record to history
$ history
 2511  history
 2512  echo "Let's add a record to history"
 2513  history

如我们所见,我们只能将最后 3 个命令存储在 Bash 内存中。

另一方面,HISTFILESIZE变量控制我们可以写回到磁盘上的历史文件的最大行数

让我们检查变量的默认值:

$ echo $HISTFILESIZE
500

因此默认情况下,我们最多可以向*~/.bash_histor*文件写入 500 行。

考虑我们在 Bash 会话中执行 500 多个命令的情况。因此,在 Bash 退出时,当 Bash 会话结束时,只有最后 500 个命令被存储回历史文件。

4. 理解差异

我们现在进行一些实验,将HISTFILESIZE的值设置为小于HISTSIZE 的值:

$ HISTFILESIZE=5 &&  echo $HISTFILESIZE
5
$ HISTSIZE=10 && echo $HISTSIZE
10

现在,让我们在终端上执行一些测试命令:

$ echo "Command1" >/dev/null
$ echo "Command2" >/dev/null
$ echo "Command3" >/dev/null
$ echo "Command4" >/dev/null
$ echo "Command5" >/dev/null
$ echo "Command6" >/dev/null
$ echo "Command7" >/dev/null
$ echo "Command8" >/dev/null
$ echo "Command9" >/dev/null
$ echo "Command10" >/dev/null
$ echo "Command11" >/dev/null
$ echo "Command12" >/dev/null

让我们检查历史命令的输出:

$ history
  508  echo "Command4" >/dev/null
  509  echo "Command5" >/dev/null
  510  echo "Command6" >/dev/null
  511  echo "Command7" >/dev/null
  512  echo "Command8" >/dev/null
  513  echo "Command9" >/dev/null
  514  echo "Command10" >/dev/null
  515  echo "Command11" >/dev/null
  516  echo "Command12" >/dev/null
  517  history

正如我们所观察到的,输出显示了最后 10 个命令。这等于HISTSIZE变量的值。

现在让我们优雅地退出当前 Bash 会话,重新登录,并验证history命令的输出:

$ history
    1  echo "Command10" >/dev/null
    2  echo "Command11" >/dev/null
    3  echo "Command12" >/dev/null
    4  history
    5  exit

在这里,输出仅包含前一个会话的最后 5 行。如本示例所示,只有最后 n 行(n 等于*HISTFILESIZE 的值)*被写入磁盘并可供下一个会话使用。

**重要的是要注意,由于这些环境变量中的值不兼容,我们可能会丢失历史数据。因此,我们应该始终谨慎选择它们的值。**这些值应该足够大以容纳会话和整个历史记录。