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

但是如果我执行tail -f $HISTFILEtail -f ~/.bash_history,它们将不会列出。

文件被锁定了吗?有临时位置或类似地点吗?

#1 楼

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


当交互式shell退出时,最后的$ HISTSIZE行将从历史记录列表复制到$ HISTFILE


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


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


还有一个-w选项:


写出当前历史记录保存到历史记录文件。


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

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

export PROMPT_COMMAND='history -a'


评论


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

–torek
19年7月4日在3:53

#2 楼

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

如果您由于只想删除特定命令(例如,包含明文密码)而检查.bash_history,则可以通过history -d <entry_id>直接删除内存中的条目例如,假设输出类似:

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


,而您想清除export线,则可以通过以下方式简单地实现: br />
history -d 928


#3 楼

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

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

评论


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

–安东
2014年7月18日在9:08

确实更好

–安东
14年7月18日在13:24

#4 楼

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


设置了-o history(H中的echo "$-")。
HISTSIZE不是0并且

HISTIGNORE不是*(或其他一些限制性很强的模式)。

如果以上任何一个失败,则不会在内存中存储任何历史记录,因此任何历史记录都不会也不会

如果满足以下条件,则将内存中的历史记录写入磁盘:

HISTFILESIZE不为0并且未设置
HISTFILE。

但仅当shell退出或执行history -a(附加)或history -w(写入)命令时。

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

 PROMPT_COMMAND='history -a'


,这会将append历史记录行记录到历史记录文件中。这些是自当前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
19-10-2在11:26



@oneindelijk历史记录仅将当前shell的内存中历史记录写入历史记录文件。 Cron作业可能无法访问其他正在运行的Shell的历史记录。

–wensveen
20 Mar 27 '20 at 14:22

我们如何防止多个终端命令历史相互干扰?

–本征场
20-09-5在8:19

#5 楼

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

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

评论


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

–John WH Smith
2014年7月18日12:50