bash的历史记录存储在哪里?


95

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

但是,如果我做的tail -f $HISTFILE还是tail -f ~/.bash_history,他们没有得到上市。

文件是否被锁定,是否存在临时位置或类似位置?

Answers:


117

Bash在运行时会在内存中内部维护命令列表。它们.bash_history在退出时被写入:

退出交互式外壳程序时,最后的$ HISTSIZE行将从历史记录列表复制到$ HISTFILE命名的文件中

如果要强制写出命令历史记录,可以使用该history -a命令,该命令将:

将新的历史记录行(自当前Bash会话开始以来输入的历史记录行)添加到历史记录文件。

还有一个-w选项:

将当前历史记录写到历史记录文件中。

这可能更适合您,具体取决于您使用历史记录的方式。

如果要确保始终立即编写它们,可以将该命令放入PROMPT_COMMAND变量中:

export PROMPT_COMMAND='history -a'

旁注:如果您的.bash_history文件意外地由root拥有,则一切都会停止。在这种情况下,请检查所有权并sudo在需要时用于修复所有权。
torek

13

(不是答案,但我无法添加评论)

如果您.bash_history只是因为要删除特定命令而进行检查(例如,以明文形式包含密码),则可以直接通过删除内存中的条目history -d <entry_id>

例如,假设输出如下:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

而您想清除这export条线,可以通过以下方法简单地实现:

history -d 928

11

bash将其保存在工作内存中,可以将bash配置为在bash关闭时或在每个命令之后保存它,并在bash启动时或在请求时加载。

如果配置为在每个命令之后保存,请考虑同时运行多个bash的含义。(命令行将交错)


2
答案的开始听起来像历史记录存储在名为bash的文件中,甚至存储在可执行文件中bash。我会写“它存储bash在内存中,...”
Anthon

确实更好
Anthon

5

会话处于活动状态时,命令将保存在内存(RAM)中。关闭外壳程序后,将.bash_history在关机之前将命令列表写入其中。

因此,您不会在中看到当前会话的历史记录.bash_history


4
历史记录文件在bash终止时会更新,这并不意味着重新启动(尤其是在您可以根据需要打开和关闭终端的图形环境中)。
约翰·史密斯

4

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

  • 设置-o历史记录(位于Hecho "$-")。
  • HISTSIZE不是0
  • HISTIGNORE不是*(或其他非常严格的模式)。

如果以上任何一项失败,则没有历史记录存储在内存中,因此任何历史记录都无法或不会写入磁盘。

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

  • HISTFILESIZE不为0,并且
  • HISTFILE尚未设置。

但是仅当外壳退出或执行命令history -a(追加)或history -w(写入)时才如此。

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

 PROMPT_COMMAND='history -a'

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

将此工作放在cron作业中会有什么问题吗?我怀疑用户名少得多的许多用户正在登录到特定服务器,并且历史记录仍然很小,这是一台旧服务器,但是也许某些会话从未关闭过……
oneindelijk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.