9

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.

3 Answers 3

12

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.

3
6

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

1

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.

3
  • I'm running bash-4.3.33, and my man pages don't mention /etc/bash.bashrc either. What version of bash and which distributuion are you running?
    – x-yuri
    Commented Feb 28, 2015 at 13:15
  • I'm running arch linux. I guess debian patches the man pages.
    – x-yuri
    Commented Feb 28, 2015 at 13:18
  • @x-yuri I only checked on my Debian derivative. I falsely assumed that bash is the same for all Linux distros.
    – Anthon
    Commented Feb 28, 2015 at 14:51

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .