Adi*_*sak 130 bash command-history
如果我运行history,我可以看到我最近执行的命令。
但如果我这样做tail -f $HISTFILE或tail -f ~/.bash_history,它们不会被列出。
文件是否被锁定,是否有临时位置或类似的位置?
Mic*_*mer 159
Bash 在运行时在内存中内部维护命令列表。它们.bash_history在退出时写入:
当交互式 shell 退出时,最后的 $HISTSIZE 行会从历史列表复制到 $HISTFILE 命名的文件中
如果要强制写出命令历史记录,可以使用以下history -a命令:
将新的历史行(自当前 Bash 会话开始以来输入的历史行)追加到历史文件中。
还有一个-w选项:
将当前历史写入历史文件。
这可能更适合您,具体取决于您如何使用历史记录。
如果您想确保它们总是立即写入,您可以将该命令放入您的PROMPT_COMMAND变量中:
export PROMPT_COMMAND='history -a'
Run Code Online (Sandbox Code Playgroud)
Edd*_* C. 21
(不是答案,但我无法添加评论)
如果您正在检查.bash_history是因为您只想删除特定命令(例如包含明文密码),您可以通过 直接删除内存中的条目history -d <entry_id>。
例如,假设输出如下:
$ history
926 ll
927 cd ..
928 export --password=super_secret
929 ll
Run Code Online (Sandbox Code Playgroud)
并且您想清除该export线路,您可以通过以下方式轻松实现:
history -d 928
Run Code Online (Sandbox Code Playgroud)
ctr*_*lor 12
bash 将它保存在工作内存中,bash 可以配置为在 bash 关闭时或在每个命令之后保存它,并在 bash 启动或请求时加载。
如果您配置为在每个命令之后保存,那么请考虑同时运行多个 bash 的影响。(命令行将交错)
在运行时,如果出现以下情况,历史记录仅保存在内存中(默认情况下):
Hin echo "$-") 已设置。0 和*(或其他一些非常严格的模式)。如果上述任何一项失败,则不会在内存中存储任何历史记录,因此不会或将不会将任何历史记录写入磁盘。
在以下情况下,内存中的历史记录将写入磁盘:
但仅当 shell 退出或执行命令history -a(append) 或history -w(write) 时。
要触发立即写入磁盘,您可以使用该变量:
PROMPT_COMMAND='history -a'
Run Code Online (Sandbox Code Playgroud)
这将append在new历史系的历史文件。这些是自当前 bash 会话开始以来输入的历史行,但尚未附加到历史文件中。
或者:
PROMPT_COMMAND='history -w'
Run Code Online (Sandbox Code Playgroud)
要改写历史与从内存列表中的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
Run Code Online (Sandbox Code Playgroud)
并使用最后一条命令将其写入磁盘:
history -w # with `shopt -u histappend` unset
Run Code Online (Sandbox Code Playgroud)
小智 5
当您的会话处于活动状态时,命令会保存在内存 (RAM) 中。只要您关闭 shell,命令列表就会.bash_history在关闭之前写入。
因此,您不会在.bash_history.