我做了一些关于历史的测试:
我跑了
history-c
,然后退出了。这清除了当前 shell 的历史记录。我跑了
history -c && history -w
。这删除了所有内容。我通过 vi 编辑器删除了历史文件的全部内容:
$vi ~/.bash_history
. 然后我退出了。在下一次登录时,当我history
只运行最后一个 shell 会话的行或命令时。
这表明history -w
我们关闭 shell 会话时的操作和操作之间存在差异。
当我们关闭一个 shell 会话时会发生什么?
我认为history -w
将内存内容覆盖到历史文件,并history -c
删除内存内容。这个对吗?
在处理 Bash 历史时,我们有两种:
.bash_history
磁盘上的文件当 Bash 启动时(假设是默认配置),它会将文件的内容加载
.bash_history
到内存中的历史列表中(如果需要,在将其截断为配置的大小之后)。然后你输入你的命令,这些命令只附加到内存中的历史列表中。磁盘上的历史文件不会被触及。
默认情况下,定期退出 Bash 会话(不是强行杀死它或导致它以某种方式崩溃)会截断内存中的历史列表以适应配置的最大大小,然后仅附加当前 Bash 会话中的新条目(因为默认情况下该
histappend
选项已启用) 到磁盘上的历史文件中,而无需删除已删除的条目或重新添加以前会话中的内容。当您运行时,
history -c
您会清除内存中的完整历史列表,但这不会影响磁盘上的历史文件。运行
history -w
会将内存中的当前历史列表写入磁盘上的历史文件。它不会追加新条目,而是覆盖整个文件。因此,history -c && history -w
有效运行也会清除历史文件。通过从正在运行的 Bash 会话中编辑历史文件来手动清除历史文件并没有达到预期的效果,或者到目前为止永久删除整个历史,因为内存中仍然包含历史文件中所有旧条目的历史列表将保持不变。
在退出 Bash 会话时,历史文件将被历史列表中的数据重写。但是,默认情况下,该
histappend
选项是启用的,只有当前 Bash 会话中的新条目才会写入文件,旧的历史数据会被丢弃。您必须运行history -w
才能将完整的历史记录列表保存到磁盘。Bash shell 启动和退出时究竟会发生什么,可以阅读
man bash
: