When is /etc/bash.bashrc invoked?
What is this file anyway? Documentation makes no mention of it. And it’s not supposed to be run automatically (version
4.3, 2 February 2014):
Invoked as an interactive login shell, or with –login
When Bash is invoked as an interactive login shell, or as a non-interactive shell with the –login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The –noprofile option may be used when the shell is started to inhibit this behavior.
When a login shell exits, Bash reads and executes commands from the file ~/.bash_logout, if it exists.
Invoked as an interactive non-login shell
When an interactive shell that is not a login shell is started, Bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the –norc option. The –rcfile file option will force Bash to read and execute commands from file instead of ~/.bashrc.
So, typically, your ~/.bash_profile contains the line
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
after (or before) any login-specific initializations.
When Bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the filename.
As noted above, if a non-interactive shell is invoked with the –login option, Bash attempts to read and execute commands from the login shell startup files.
When an interactive shell that is not a login shell is started, bash
reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if
these files exist. This may be inhibited by using the –norc option.
The –rcfile file option will force bash to read and execute commands
from file instead of /etc/bash.bashrc and ~/.bashrc.
The documentation you quote doesn’t seem to be up-to-date.
- What is
/etc/bash.bashrc? It doesn’t seem to be documented.
The Debian version of bash is compiled with a special option
-DSYS_BASHRC) that makes
for interactive non-login shells. So, on Debian systems,
/etc/bash.bashrc is invoked for interactive, non-login bash shells for all users.
/etc/profile (which is invoked for all login shells) calls
/etc/bash.bashrc as well. So that means
/etc/bash.bashrc is also invoked for all logins shells as well.
However, the first line usually checks quits if non-interactive.
So in the end, effectively
/etc/bash.bashrc is executed for all interactive bash shells (login and non-login). Think of it as the system-wide