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.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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.

Method 2

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

Method 3

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.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x