OS X终端历史记录丢失命令

17

我知道我前几天输入了一个命令,但现在无法使用history或.bash_history找到它。你有任何想法为什么会发生这种情况吗?我怀疑这与在我的OS X终端中使用多个选项卡有关,以某种方式历史记录不会在选项卡之间传递,但我不确定。

6个回答

27

我的终端出现了问题,后来发现它在 ~/.bash_sessions 文件夹中保存新生成的文件。这是 El Capitan 引入的管理 bash 会话的新方法,在 /etc/bashrc_Apple_Terminal 文件中有详细说明。可以通过运行 echo $HISTFILE 命令确认这一点。要禁用此行为,只需运行 touch ~/.bash_sessions_disable 命令。然后退出终端应用程序并重新启动它。现在它应该正确保存历史记录,可以再次通过 echo $HISTFILE 命令进行确认。希望这能帮到你!


非常感谢。我在MacOS High Sierra中遇到了这个问题。 - Misael Barreto
这个 bug 在 Mojave 上仍然存在(在全新的 Mac mini 上)。直到我按照这里描述的禁用会话之前,它根本没有保存任何 bash 历史记录。 - jakob.j
这个提示在Mojave对我无效。我有~/.bash_sessions_disable文件,但它似乎仍然会任意地记住不同窗口的不同历史记录。 - John Smith
在最新版本的 macOS 中禁用会话,您需要在 ~/.zprofile 中更改类似的设置。 - undefined

8

从OS X El Capitan 10.11开始,默认情况下,Bash被配置为为每个终端保存单独的命令历史记录,因此它们可以单独恢复以进行 Resume 操作。

每个单独的历史记录也会在 shell 退出时附加到全局历史记录中的 ~/.bash_history 中。如果您退出终端然后重新打开它 - 无论是否启用 Resume,您应该发现来自每个终端的命令都在~/.bash_history 中。如果您已启用 Resume,则每个恢复的终端将仅包含其恢复的历史记录,但是当您创建新的终端时,它将从最新的全局历史记录开始。

由于所有命令历史记录都附加到全局的~/.bash_history 文件中,您可能希望通过设置 HISTFILESIZE 环境变量来增加存储的命令数量,以便最新的终端历史记录不会太快地将其他终端历史记录推出文件。默认值为 500。我将我的设置为 10,000。我还将 HISTSIZE 设置为 10,000,以便可以浏览整个历史记录(否则,只能从历史记录文件中读取最后 500 条)。

安排单独的命令历史记录的脚本在 OS X El Capitan 10.11 及更高版本中的 /etc/bashrc_Apple_Terminal 中。它包含详细的注释,描述了机制的工作原理以及如何自定义或禁用它。


2
什么意思:“如果您已启用简历”。我在哪里可以为我的终端启用简历选项? - Marcin Kapusta

3

这种情况经常发生。我会打开多个命令窗口,历史记录按关闭的顺序保存。你需要的命令可能会被其他命令窗口覆盖掉。


有没有办法防止这种情况发生? - meisel
在我使用的csh(实际上是tcsh)中,有一个选项可以在退出shell时合并命令历史记录。它可以工作,但如果您的历史记录中有10,000行,它会很慢。通过谷歌搜索,似乎也有让bash做到这一点的方法,但我对bash不太熟悉。 - Andras

2

我非常确定这是一个bug。我登录了一个访客账户,所以配置文件是原始的。在主目录中,我执行了以下操作:

touch .bash_history 然后 tail -f .bash_history 来查看何时保存命令。

当终端会话关闭时,命令应该保存到全局的.bash_history文件中。我发现至少有一半的时间,关闭终端后命令没有保存到文件中。它似乎很随机,不知道什么时候会发生和不发生。它也似乎会连续多次出现,然后再次变得不稳定。如果我使用exit而不是Command-W退出终端会话,它似乎每次都能正常工作。


1
这里肯定有一些错误。我经常使用 exit 命令,但注意到 .bash_history 根本没有被写入。在找到这篇文章后,我尝试使用 Command-W 来关闭窗口。突然间,无论我如何关闭窗口,一切都正常了。 - robotspacer

1
在我的情况下,当我输入history时,它只显示最近的16个命令。然而,我可以通过Ctrl+R来回忆旧的命令,所以我知道命令历史实际上更长。
截至2021年,命令历史记录位于名为.zsh_history的文件中:
  • 打开你的命令终端。
  • 进入你的主目录:cd ~
  • 列出所有文件:list -al
  • 你应该在那里找到它。
你可以用vi打开它:vi .zsh_history,并搜索你的命令。

这是一个令人沮丧的混乱...

tail -n 1000 ~/.zsh_history

- randomx

0
echo 'alias history="history 1"' >> ~/.zshrc && source ~/.zshrc && history

1
请编辑并解释这个回答如何回答问题,并且因为这是一个11年前的问题,已经有其他5个答案了,它又给这些答案增添了什么内容。 - soundflix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接