Bash 历史变量HISTSIZE与HISTFILESIZE
1.概述
在本教程中,我们将了解 Bash HISTFILESIZE 和HISTSIZE 变量的重要性。我们还将检查它们的默认值以及它们的不同之处。
2. Bash 历史及其默认行为
当 Bash shell 在用户登录时以交互方式加载时,它会将历史文件的内容读入内存。在 shell 会话期间,它将内容添加到 history 的内存副本中。
当我们在终端上执行history 命令时,Bash 会读取内存中的副本以显示已执行命令的历史记录。最后,当 shell 退出时,它会将内存中的内容写回到磁盘上HISTFILE环境变量指向的文件中。
默认情况下,内容存储在位于用户主目录的*.bash_history*文件中:
$ echo $HISTFILE
/home/shubh/.bash_history
历史文件中可以存储的行数由两个特殊变量HISTSIZE和HISTFILESIZE控制。
3. HISTSIZE和HISTFILESIZE变量
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 的值)*被写入磁盘并可供下一个会话使用。
**重要的是要注意,由于这些环境变量中的值不兼容,我们可能会丢失历史数据。因此,我们应该始终谨慎选择它们的值。**这些值应该足够大以容纳会话和整个历史记录。