在 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 年以来发布的版本的许可证。