Mac终端会话之间不保留Bash历史记录


33

我的bash历史神秘地停止了工作,并且我不知道如何解决它。这是我的.bashrc的样子:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

但是,当我运行时,echo $HISTFILE它会打印出来/Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew

我是.bash_history文件的所有者,所以我不太确定如何解决此问题。

谢谢!


您好Nelson,欢迎来到超级用户。快速检查一下,您是否插入了这些空格?
bertieb

是的,我会删除它们并报告。

@bertieb,我删除了空格,现在正确地回显了$ HISTFILESIZE。但是,历史记录仍未保存,$ HISTFILE会打印出该临时温度历史记录文件(我假设该文件仅存储该会话的历史记录)。

您是否$HISTFILE出于兴趣而尝试更改?我.bashrc在OSX上没有安装,并echo $HISTFILE报告了我期望的位置-注释掉有问题的行是否有效果?
bertieb

1
一律引用路径名变量扩展名:HISTFILE="$HOME/.bash_history”。如果您的主目录路径中包含空格(或其他特殊字符),则没有引号的版本将无效。
克里斯·佩吉

Answers:


26

终端为每个终端会话分配一个唯一的标识符,并通过TERM_SESSION_ID环境变量进行通信,以便在终端上运行的程序在退出并重新启动启用了Resume的终端时可以保存/恢复特定于应用程序的状态。

新文件夹(〜/ .bash_sessions /)用于存储会话唯一的HISTFILE和.session文件。

在Shell启动期间,将执行会话文件。旧文件会定期删除。

默认行为安排为每个恢复的终端会话独立保存和恢复bash命令历史记录。它还将命令合并到新会话的全局历史记录中。

您可以通过设置以下方式禁用此行为并共享一个历史记录

export SHELL_SESSION_HISTORY=0

如果定义了HISTTIMEFORMAT,则默认情况下将禁用每个会话的历史记录(在/ private / etc / bashrc_Apple_Terminal中了解更多信息)

如果存在以下文件,则将禁用保存/恢复机制:

~/.bash_sessions_disable

自El Capitan发布以来,苹果已经改变了某些行为,因此最好在此处阅读更多内容 less /private/etc/bashrc_Apple_Terminal


3
但是,不要仅仅从禁用保存/恢复机制开始。如果您在shell命令历史记录方面遇到问题,请尝试解决该问题。该~/.bash_sessions_disable文件是万不得已的解决方案,以防万一。它不仅禁用每个会话命令历史记录,而且可以禁用每个会话命令历史记录。有关/etc/bashrc_Apple_Terminal详细信息,请参见中的注释。
克里斯·佩奇

1
@ChrisPage实际上,Apple更改了一些脚本。更新的答案,谢谢。
diimdeep 2015年

@diimdeep我将在哪里添加这一行?export SHELL_SESSION_HISTORY=0
zerohedge

@zerohedge .bashrc.bash_profile unix.stackexchange.com/a/310150/15362
diimdeep

@diimdeep谢谢。这似乎现在正在起作用。有什么影响吗?
zerohedge

6

在El Capitan升级后,我注意到了类似的情况。只需将文件.bash_sessions_disable文件添加到您的主目录中即可禁用新的bash会话,并且bash会话.bash_history已重新使用。

Reddit线程具有更多信息和更多链接。


但是,不要仅仅从禁用保存/恢复机制开始。如果您在shell命令历史记录方面遇到问题,请尝试解决该问题。该~/.bash_sessions_disable文件是万不得已的解决方案,以防万一。它不仅禁用每个会话命令历史记录,而且可以禁用每个会话命令历史记录。有关/etc/bashrc_Apple_Terminal详细信息,请参见中的注释。
克里斯·佩奇

谢谢克里斯-在最近几个月中,它还能使我的历史记录失效吗(与以前的osx版本相同且与linux相同)一直在按预期工作。不知道他们为什么要改变它?
rabs

@rabs我建议SHELL_SESSION_HISTORY=0在的顶部添加~/.bash_profile
Teejay


3

来自Reddit线程的答案为我节省了:

RVM可能阻止了bash_sessions运行的退出“钩子”。如果注释掉.bash_profile中的以下行,则该行应该有效。

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

这确实有帮助!
卡尔斯滕

1

如果是Mac,我想它的默认登录外壳是bash,它运行.profile而不是.bashrc。因此,您编辑的文件错误。


我已经编辑了.profile,因此它与我的.bashrc相同,并且历史记录仍然没有出现。

@NelsonLiu在回声$HISTFILE的不同部分会发生什么profile?也许您提供了另一个可以更改变量的脚本?我选中了TerminaliTermbash 3并且4 都具有默认值$HOME/.bash_history
theoden

如何在个人资料的不同部分中回显$ HISTFILE?

@NelsonLiu,不是很明显吗?您的目标是跟踪$HISTFILE变化的时间。因此,只需使两个echo $HISTFILE包围您的代码即可。您要做的是找到要$HISTFILE更改的代码段,方法是将两echo $HISTFILE行越来越近地逐行移动,直到发现某些东西为止。就这样。
theoden

1
所以我按照您的指示进行了操作,并将.bash_profile设置为profile。我决定echo $HISTFILE在每一行上,只是查看是否存在差异。但是,它只是印刷/Users/username/.bash_history了无数次。然后echo $HISTFILE,我进入外壳,然后输出/Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew

0

我在High Sierra上看到了这个问题。不知何故,我自己的.bash_history已由root拥有,甚至没有其他用户的读取权限(使用ls -al查看主目录的内容时)

这个.bash_history文件没有任何影响,所以我做了一个sudo rm .bash_history,然后触摸.bash_history来制作一个新文件。

现在一切似乎都很好


对我来说,这不是文件许可权,而是我没有定义任何HIST控制变量。显然必须定义其中一个或多个。我将此添加到我的~/.bash_profile文件中:export HISTTIMEFORMAT='%F %T '
MarkHu
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.