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.

Invoked non-interactively

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.

Asked By: x-yuri

||

From man bash:

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.

Answered By: Anthon

From Debian’s bash README:

  1. 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 bash read /etc/bash.bashrc before ~/.bashrc
for interactive non-login shells. So, on Debian systems,
/etc/bash.bashrc is to ~/.bashrc as /etc/profile is to
~/.bash_profile.

Answered By: Stephen Kitt

Technically, /etc/bash.bashrc is invoked for interactive, non-login bash shells for all users.

However, usually /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 ~/.bashrc

Answered By: wisbucky
Categories: Answers Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.