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

How can I disable Bash sessions in OS X El Capitan

OS X El Capitan(10.11 测试版)is Bash sessions (Terminal sessions) 中看似新的功能。我现在有一个包含历史文件的 ~/.bash_sessions 目录,我的 HISTFILEHISTIGNORE envars 被覆盖了。我怎样才能禁用所有这些功能?

如果您手动启动新的 Bash 会话(即 bash -xl),您可以在登录时看到 运行 是什么。

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

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

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

此行为在 /etc/bashrc_Apple_Terminal 中定义。它包含描述它的作用以及如何自定义它的文档注释。

您可以通过在 ~/.bashrc 脚本中设置 SHELL_SESSION_HISTORY=0 来禁用 per-terminal-session 命令历史功能,如下所述:

You may disable this behavior and share a single history by setting SHELL_SESSION_HISTORY to 0. There are some common user customizations that arrange to share new commands among running shells by manipulating the history at each prompt, and they typically include 'shopt -s histappend'; therefore, if the histappend shell option is enabled, per-session history is disabled by default. You may explicitly enable it by setting SHELL_SESSION_HISTORY to 1.

请注意,虽然您可以通过创建 ~/.bash_sessions_disable 来禁用整个 session-state 恢复机制,但仅禁用 per-session 命令历史功能是不必要的,因此不推荐这样做。

总而言之,这与 Apple 的 Resume 功能有关。启用此功能后,当您退出应用程序或重新启动时,应用程序下次打开时将打开之前打开的windows。

关于 Terminal,要做到这一点,必须准备好三件事:

  1. $HOME/.bash_sessions_disable 必须 在场
  2. System Preferences/General/Close Windows when quitting an app 必须 被选中。
  3. 重新启动时,select Reopen windows

当您重新打开终端时,它会重新打开相同的 windows 和您之前在相同屏幕位置的选项卡。此外,如果您已选中 Terminal/Preferences/your-window-type/Windows/Resume/Restore-text-when-reopening-windows,它将恢复每个屏幕上的文本。

最后,这与 OP 的问题具体相关,如果满足以下条件,它将恢复每个 window/tab 中的历史记录:

  1. SHELL_SESSION_HISTORY 未设置或设置为 1
  2. shopt histappend 未设置
  3. HISTTIMEFORMAT 未设置

如果SHELL_SESSION_HISTORY.bashrc中明确设置为1,最后两个要求被覆盖,即可以设置shopt histappendHISTTIMEFORMAT

另外需要注意HISTSIZEHISTFILESIZE两个变量。它们不应太大或太小,有些人建议不要设置它们,以便采用 Apple 的默认值。

到目前为止,关于这个主题的所有内容都是准确且有用的,应该使用已经提到的技术来代替它。我要提到一个完全核的方法,只是为了娱乐替代方案,同时也为了进一步扩展对这个主题的理解。

我获得这些知识的唯一原因仅仅是因为我正在寻找一种替代解决方案来需要创建一个 ~/.bash_sessions_disable 文件;相反,我宁愿通过向我现有的 ~/.bash_profile 添加一些行来防止会话行为的发生。不幸的是,如果不使用核能,那是不可能的,所以官方的答案仍然是最好的方法。

总结

当 Bash 首次在 MacOS 上启动时,它将首先获取 /etc/profile,然后获取 /etc/bashrc。该文件的内容包括这一行:

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

$TERM_PROGRAM 环境变量仅由 Apple 的终端应用设置。打印该变量的值 returns Apple_Terminal。换句话说,如果 /etc/bashrc 文件存在且可读,它会尝试获取 /etc/bashrc_Apple_Terminal 文件。在这个文件中,MacOS 执行其特殊的 Bash 会话处理,以配合 OS.

的恢复功能

毕竟,Bash 将获取用户在其主目录中的任何配置(如 ~/.bash_profile~/.bashrc)。话虽如此,如果不执行其他人已经提到,即将 $SHELL_SESSION_HISTORY 设置为 0 以消除基于会话的历史记录,并创建一个 ~/.bash_sessions_disable 以防止每次 Apple 的终端被创建 .bash_sessions 目录开始了。

核方法

消除任何此新 MacOS 功能的两种可能的替代方法是 1) 从 /etc/bashrc 文件中删除最后一行,或 2) 重命名或删除 /etc/bashrc_Apple_Terminal 到别的东西。

执行此操作后,Apple 终端应用程序的行为将不再与非 Apple 终端模拟器不同。