bash 的历史存储在哪里?

Adi*_*sak 130 bash command-history

如果我运行history,我可以看到我最近执行的命令。

但如果我这样做tail -f $HISTFILEtail -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)

  • 旁注:如果你的 `.bash_history` 文件意外地被 root 所有,事情就会停止工作。在这种情况下,请检查所有权并在需要时使用 `sudo` 来修复所有权。 (2认同)

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 的影响。(命令行将交错)

  • 你回答的开头听起来好像历史记录存储在一个名为 bash 的文件中,甚至存储在 `bash` exetable 中。我会写“它由`bash`存储在内存中,......” (3认同)

ImH*_*ere 6

在运行时,如果出现以下情况,历史记录仅保存在内存中(默认情况下):

  • set -o history (an Hin echo "$-") 已设置。
  • HISTSIZE 不是0
  • HITIGNORE 不是*(或其他一些非常严格的模式)。

如果上述任何一项失败,则不会在内存中存储任何历史记录,因此不会或将不会将任何历史记录写入磁盘。

在以下情况下,内存中的历史记录将写入磁盘:

  • HISTFILESIZE 不是 0并且
  • HISTFILE 未设置。

但仅当 shell 退出或执行命令history -a(append) 或history -w(write) 时。

要触发立即写入磁盘,您可以使用该变量:

 PROMPT_COMMAND='history -a'
Run Code Online (Sandbox Code Playgroud)

这将appendnew历史系的历史文件。这些是自当前 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.

  • 历史文件在“bash”终止时更新,这并不意味着重新启动(特别是在您可以随意打开和关闭终端的图形环境中)。 (4认同)