为什么默认 bash 似乎没有我历史上使用过的一些命令,但有其他命令?

为什么默认 bash 似乎没有我历史上使用过的一些命令,但有其他命令?

在 Mac 上,塞拉。

我没有HIST看到相关的设置:

~ @ Magni (jcollum) 
$ env|grep HIST

~ @ Magni (jcollum) 
$ cat ~/.bash_profile | grep HIST

~ @ Magni (jcollum) 

但在我的历史记录中,我昨天所做的一些事情在重新启动后就不再存在了。真的很怀疑我每次执行命令时都会在命令前添加空格。

我知道这里有帖子告诉我如何修复它,但我想知道为什么事情是这样发生的。

例如,当我 grep 查找curl我昨天运行的 a 时,什么也没有:

~ @ Magni (jcollum) 
$ history | grep curl 
166  curl -X POST -d [email protected] -d password=********** http://localhost:3000/login
503  hg curl 
519  history | grep curl 

400 条命令前?我知道curl过去一周我已经使用了十几次,但是(而且我本周使用 bash 的次数还不足以运行数百个命令)。

基本上我只是感到困惑,不知道为什么它缺少我所做的这么多。历史是否有可能仅从一个 bash 实例记录?

答案1

历史是否有可能仅从一个 bash 实例记录?

这就是正在发生的事情。除非您竭尽全力进行更改,否则 bash 中历史记录的工作方式是:

  • 当 bash 启动时,它会从历史文件中加载保存的历史记录。
  • 每次执行命令时,它都会添加到 bash 内存中的历史记录中。
  • 当bash退出时,它会将累积的历史记录保存到历史文件中。

现在假设您启动了两个 bash 实例。两者在启动时都会加载历史文件。两者都将它们运行的​​命令添加到自己的历史记录中。当一个实例退出时,它将旧的历史记录及其自己的命令保存到历史文件中。当第二个实例退出时,它保存了旧的历史记录加上它是自己的命令写入历史文件 - 在执行此操作时,它会擦除​​第一个退出实例的历史记录。

Bash 的历史记录保存机制过于简单。您的历史记录受其他所有正在运行的实例的支配——最后退出的实例会擦除其他实例的历史记录。解决方案包括将新的历史记录附加到历史文件中,而不是用整个内存中的历史记录覆盖历史文件,或者在执行行后立即将行附加到历史文件中。看在多个终端窗口中保留 bash 历史记录在多个终端窗口中保留 bash 历史记录了解实现此变体和其他变体的一些方法。

最简单的解决方案是运行 zsh,它默认以合理的方式保存历史记录。我建议这样做,特别是因为您运行的是 macOS,它停留在旧版本的 bash 上,因为 Apple 不喜欢 2009 年以来发布的版本的许可证。

相关内容