6

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.

7

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.

  • It would appear that this -DSYS_BASHRC causes the /etc/bash.bashrc to be sourced, even when the --rcfile flag is used, which is in direct contradiction of what the man pages and documentation says. The only way I found to only use my rc file is to run bash in posix mode and use the ENV environment variable ENV=myrc bash --posix. If you don't want to be in posix mode, add set +o posix at the beginning of myrc file. (Does not work on Mac for unknown reason. However on Mac, -DSYS_BASHRC is not used, so you can use --rcfile myrc and get the desired result) – Andy Jul 13 '17 at 15:41
  • @Andy I strongly recommend filing a bug — run reportbug bash on your Debian system. – Stephen Kitt Jul 13 '17 at 15:46
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.

  • 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 Feb 28 '15 at 13:15
  • I'm running arch linux. I guess debian patches the man pages. – x-yuri Feb 28 '15 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 Feb 28 '15 at 14:51
1

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.