如何在OS X El Capitan中禁用Bash会话

43
在OS X El Capitan (10.11 Beta)中,似乎有一个新的功能 Bash会话(Terminal会话)。我现在有一个~/.bash_sessions目录,其中包含历史文件,我的HISTFILEHISTIGNORE环境变量被覆盖了。我该如何禁用所有这些功能?

1
“…我的… HISTIGNORE 环境变量被覆盖了。” 你确定吗?/etc/bashrc_Apple_Terminal 没有改变 HISTIGNORE(它根本没有被引用)。 - Chris Page
2
如果启用了histappend shell选项,则默认情况下禁用每个会话的历史记录。 - yckart
4个回答

44

如果您手动启动一个新的Bash会话(即bash -xl),您可以查看登录时运行的内容。

您将在输出中看到以下行:

....
+++ '[' '!' -e /Users/username/.bash_sessions_disable ']'

您可以在主目录中创建一个.bash_sessions_disable文件来禁用此功能。


@WGroleau:这个功能不是关于历史记录的数量,而是关于为每个终端会话存储单独的命令历史记录,以便如果您使用“恢复”功能还原终端,则历史记录将保持分离状态——就像您最初创建它们时一样。通常的HISTSIZEHISTFILESIZE shell变量仍然适用。实际上,建议您将其中一个或两个变量设置得更大,因为每个会话还会将其历史记录附加到全局的~/.bash_history文件中,因此您的所有历史记录都可以在新的终端中使用。有关详细信息,请参见/etc/bashrc_Apple_Terminal中的注释。 - Chris Page
@WGroleau:它还会每天自动删除两周前的会话文件。 - Chris Page
注意,我说的是每个月两兆字节?它们并没有被删除。如果有一个变量来控制它,我会将其设置为24小时。我从未在退出后恢复过会话,如果我真的需要,那也不会是在我打开和退出其他会话之后。“所有历史记录”可用的说法略有不准确。每个会话都会读取历史记录。打开另一个会话,它会读取相同的历史记录,而不包括第一个会话的任何内容。每次退出时,它都会将已知的历史记录写入文件,覆盖原有内容。最后一个会话的历史记录保存在.bash_history中。 - WGroleau
@WGroleau “它们没有被删除。” 两周以上的文件将每天删除一次 - 所有行为都可以在/etc/bashrc_Apple_Terminal中查看。 如果您看到两周以上的文件,请提交错误报告。 如果您想控制它们保留的时间,请提交报告。 但是,如果您根本不想要每个终端会话的命令历史记录,则可以使用SHELL_SESSION_HISTORY = 0关闭它,就像我在我的答案中描述的那样。 - Chris Page
我一定会提交那个错误报告。我从未做过任何更改bash会话行为的事情。当我发现这个问题时,我清除了所有早于11月初的内容。它们目前可以追溯到2015年11月8日,每个会话都有三个文件:16K历史记录,约50字节的会话和零字节的historynew(?!?)。 - WGroleau
显示剩余3条评论

37

这种行为是在/etc/bashrc_Apple_Terminal中定义的。它包含了描述其功能以及如何自定义的文档注释。

您可以通过在~/.bashrc脚本中设置SHELL_SESSION_HISTORY=0来禁用每个终端会话的命令历史记录功能,如此处所述:

您可以将SHELL_SESSION_HISTORY设置为0,从而禁用此行为并共享单个历史记录。有些常见的用户自定义会使用“shopt -s histappend”在每个提示符处操纵历史记录以在运行的shell间共享新命令;因此,如果启用了histappend shell选项,则默认情况下禁用每个会话的历史记录。您可以通过将SHELL_SESSION_HISTORY设置为1来明确启用它。

请注意,虽然您可以通过创建~/.bash_sessions_disable来禁用整个会话状态恢复机制,但这不必要仅为了禁用每个会话的命令历史记录功能,并且不建议这样做。


1
不错的发现!然而,查看/etc/bashrc_Apple_Terminal让我相信,完全阻止该功能的唯一方法是设置"$HOME/.bash_sessions_disable"(也就是说,如果没有该文件,它仍会创建会话目录)。 - Whymarrh
@Whymarrh,你错过了我回答的一部分吗?我说那个文件会禁用会话状态机制,但如果你只想禁用每个会话的shell命令历史记录,那就过度了。 - Chris Page
1
需要注意的是,如果有人使用不同的终端,比如Alacritty或iTerm,并且从未打开过苹果的终端应用程序,则不会发生任何这些额外的行为。换句话说,大量的环境变量($TERM_SESSION_ID$SHELL_SESSION_*)和~/.bash_sessions目录将不会被创建。只有在打开苹果的终端应用程序时,所有这些额外功能才会被创建。 - danemacmillan

11
总之,这与苹果的简历功能有关。当启用此功能时,当您退出应用程序或重新启动时,下次打开应用程序时将打开以前打开的窗口。
关于终端,必须满足以下三个条件才能实现此操作:
1. 必须不存在$HOME/.bash_sessions_disable。 2. “系统偏好设置/一般/关闭应用程序时关闭窗口”必须未被选中。 3. 在重新启动时,选择重新打开窗口
重新打开终端时,它将在相同的屏幕位置重新打开以前打开的相同窗口和标签。此外,如果您已经选中了终端/首选项/您的窗口类型/窗口/恢复/重新打开窗口时恢复文本,它将恢复每个屏幕上的文本。
最后,这与OP的问题有关,如果满足以下条件,则会恢复每个窗口/选项卡中的历史记录:
1. SHELL_SESSION_HISTORY未设置或设置为1 2. 未设置shopt histappend 3. 未设置HISTTIMEFORMAT 如果在.bashrc中显式设置了SHELL_SESSION_HISTORY为1,则将覆盖最后两个要求,即可以设置shopt histappendHISTTIMEFORMAT
此外,还需要注意HISTSIZEHISTFILESIZE这两个变量。它们的值不应该过大或过小,有些人建议将它们设置为空,这样它们就会采用苹果的默认值。

echo $HISTSIZEecho $HISTFILESIZE 将显示您当前的设置。我的设置是 500。 这些是默认值吗?如何 "取消设置" 将会是有帮助的信息。 - John

2
所有关于这个主题的内容都是准确和有用的,前面提到的技术应该被使用。我将提及一种完全核心的方法,仅仅为了娱乐替代方案,并进一步扩展对这个主题的理解。
我获得这些知识的唯一原因是因为我正在寻找一个替代方案来创建一个“~/.bash_sessions_disable”文件;我宁愿通过添加一些行到我的现有“~/.bash_profile”中来防止会话行为发生。不幸的是,这是不可能的,除非采取核心方法,所以官方答案仍然是最好的方法。
总结:
当Bash在MacOS上首次启动时,它会首先源代码“/etc/profile”,然后再源代码“/etc/bashrc”。该文件的内容包括以下行:
[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"
$TERM_PROGRAM 环境变量只能被苹果的终端应用程序设置。打印该变量的值将返回 Apple_Terminal。换句话说,如果 /etc/bashrc_Apple_Terminal 文件存在且可读,则 /etc/bashrc 文件将尝试获取此文件的资源。在这个文件中,MacOS 执行其特殊的 Bash 会话处理以与操作系统的恢复功能相连接。
之后,Bash 将获取用户主目录下的任何配置(例如 ~/.bash_profile~/.bashrc)。尽管如此,在纯粹的配置级别上(而不是同时进行配置和创建新文件),没有办法覆盖在 /etc/bashrc_Apple_Terminal 文件中完成的所有工作,除非执行其他人提到的操作,即将 $SHELL_SESSION_HISTORY 设置为 0 以消除基于会话的历史记录,并创建 ~/.bash_sessions_disable 来防止每次启动 Apple 的终端时都创建 .bash_sessions 目录。 彻底做法 消除所有这些新的 MacOS 功能的两种可能替代方法要么是 1)从 /etc/bashrc 文件中删除最后一行,要么是 2)将 /etc/bashrc_Apple_Terminal 重命名或删除为其他名称。
执行此操作后,苹果的终端应用程序将不再与非苹果终端仿真器有所不同。

是的,就非常快速的浏览来看,/etc/bashrc_Apple_Terminal 做的唯一一件事情就是恢复功能。终端会话到远程系统已经足够复杂了,Mac 的记录也不太好,我对它并没有太多信心,因此我花费了很少的时间完全禁用它,并且摆脱这些额外的东西干扰我的通常的 *nix 工作流程:sudo vim /etc/bashrc 并注释掉最后一行是一个不错的快速解决方案。叹气。再次自由了。(我看到有人说“不推荐”,哈哈,但没有给出理由) - NeilG

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