问题
A seemingly new feature in OS X El Capitan (10.11 Beta) is Bash sessions (Terminal sessions). I now have a ~/.bash_sessions
directory with history files, and my HISTFILE
and HISTIGNORE
envars are being overridden. How can I disable all of this functionality?
回答1:
This behavior is defined in /etc/bashrc_Apple_Terminal
. It contains documentation comments describing what it does and how to customize it.
You can disable the per-terminal-session command history feature by setting SHELL_SESSION_HISTORY=0
in your ~/.bashrc
script, as described here:
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.
Note that, although you can disable the entire session-state restoration mechanism by creating ~/.bash_sessions_disable
, this is unnecessary just to disable the per-session command history feature, and is not recommended.
回答2:
If you startup a new Bash session manually (i.e. bash -xl
), you can see what is run on login.
You'll see the following line in the output:
....
+++ '[' '!' -e /Users/username/.bash_sessions_disable ']'
You can create a .bash_sessions_disable
file in your home directory to disable this functionality.
回答3:
To summarize, this has to do with Apple's Resume feature. When this feature is enabled, when you quit an app or reboot, the next time the app opens it will open the windows that were previously open.
With regard to Terminal, three things have to be in place for this to happen:
$HOME/.bash_sessions_disable
must not be presentSystem Preferences/General/Close Windows when quitting an app
must not be checked.- When rebooting, select
Reopen windows
.
When you reopen Terminal, it will reopen the same windows and tabs you had before in the same screen positions. Additionally, if you have checked Terminal/Preferences/your-window-type/Windows/Resume/Restore-text-when-reopening-windows
, it will restore the text on each screen.
Finally, and this relates specifically to the OP's question, it will restore the history in each window/tab if the following conditions hold:
SHELL_SESSION_HISTORY
is unset or set to 1shopt histappend
is not setHISTTIMEFORMAT
is not set
If SHELL_SESSION_HISTORY
is explicitly set to 1 in .bashrc
, the last two requirements are overridden, that is, shopt histappend
or HISTTIMEFORMAT
could be set.
Additionally, attention needs to be paid to the HISTSIZE
and HISTFILESIZE
variables. They should not be too large or too small, and some advise to leave them unset so they take Apple's default values.
回答4:
Everything so far written about this subject is accurate and useful, and the techniques already mentioned should be used in lieu of this. I'm going to mention a totally nuclear approach, just for the sake of entertaining alternatives, and also to expand further understanding of this subject.
The only reason I acquired this knowledge is simply because I was looking for an alternative solution to needing to create a ~/.bash_sessions_disable
file; I would have instead preferred preventing the sessions behaviour from happening by just adding some lines to my existing ~/.bash_profile
. Unfortunately, that is not possible without going nuclear, so the official answer is still the best approach.
Summary
When Bash first starts up on MacOS, it will first source /etc/profile
, which in turn sources /etc/bashrc
. The contents of that file include this line:
[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"
The $TERM_PROGRAM
environment variable is only set by Apple's Terminal app. Printing the value of that variable returns Apple_Terminal
. In other words, the /etc/bashrc
file is attempting to source a /etc/bashrc_Apple_Terminal
file if it both exists and is readable. It's in this file where MacOS does its special Bash session handling to tie into the Resume features of the OS.
After all that, Bash will then source any configurations a user has in their home directory (like ~/.bash_profile
or ~/.bashrc
). This being stated, there's no way to override all the work done in the /etc/bashrc_Apple_Terminal
file on a purely configuration level (vs both configuration and creating a new file) without doing what the others have mentioned, namely, setting $SHELL_SESSION_HISTORY
to 0
to eliminate session-based history, and creating a ~/.bash_sessions_disable
to prevent the .bash_sessions
directory from being created every time Apple's Terminal is started.
Nuclear Approach
The two possible alternatives to eliminate any of this new MacOS functionality would be to either 1) remove that last line from the /etc/bashrc
file, or 2) rename or delete the /etc/bashrc_Apple_Terminal
to something else.
After doing this, Apple's Terminal app will no longer behave differently than non-Apple terminal emulators.
来源:https://stackoverflow.com/questions/32418438/how-can-i-disable-bash-sessions-in-os-x-el-capitan