Answers:
Bash在运行时会在内存中内部维护命令列表。它们.bash_history
在退出时被写入:
退出交互式外壳程序时,最后的$ HISTSIZE行将从历史记录列表复制到$ HISTFILE命名的文件中
如果要强制写出命令历史记录,可以使用该history -a
命令,该命令将:
将新的历史记录行(自当前Bash会话开始以来输入的历史记录行)添加到历史记录文件。
还有一个-w
选项:
将当前历史记录写到历史记录文件中。
这可能更适合您,具体取决于您使用历史记录的方式。
如果要确保始终立即编写它们,可以将该命令放入PROMPT_COMMAND
变量中:
export PROMPT_COMMAND='history -a'
在运行时,历史记录仅在以下情况下保存在内存中(默认情况下):
H
中echo "$-"
)。0
,*
(或其他非常严格的模式)。如果以上任何一项失败,则没有历史记录存储在内存中,因此任何历史记录都无法或不会写入磁盘。
在以下情况下,内存中的历史记录将写入磁盘:
但是仅当外壳退出或执行命令history -a
(追加)或history -w
(写入)时才如此。
要触发立即写入磁盘,可以使用变量:
PROMPT_COMMAND='history -a'
这将append
在new
历史系的历史文件。这些是自当前bash会话开始以来输入的历史记录行,但尚未附加到历史记录文件中。
要么:
PROMPT_COMMAND='history -w'
要改写历史与从内存列表中的HISTFILE。
因此,您可以从内存中的历史记录中删除命令:
$ history 5
6359 ls
6360 cd ..
6361 comand --private-password='^%^&$@#)!@*'
6362 top
6363 set +o | less
$ history -d 6361
$ history 5
6359 ls
6360 cd ..
6361 top
6362 set +o | less
$ history -w
并使用最后一条命令将其写入磁盘:
history -w # with `shopt -u histappend` unset
.bash_history
文件意外地由root拥有,则一切都会停止。在这种情况下,请检查所有权并sudo
在需要时用于修复所有权。