Both the ~/.bashrc and ~/.bash_profile are scripts that might be executed when bash is invoked. The ~/.bashrc file gets executed when you run bash using an interactive shell that is not a login shell. The ~/.bash_profile only gets executed during a login shell. What does this all mean? The paragraphs below explains interactive shells, login shells, .bashrc, .bash_profile and other bash scripts that are executed during login.
Login Shells (.bash_profile)
A login shell is a bash shell that is started with – or –login. The following are examples that will invoke a login shell.
sudo su -
When BASH is invoked as a login shell, the following files are executed in the displayed order.
Although ~/.bashrc is not listed here, most default ~/.bash_profile scripts run ~/.bashrc.
Purely Interactive Shells (.bashrc)
Interactive shells are those not invoked with -c and whose standard input and output are connected to a terminal. Interactive shells do not need to be login shells. Here are some examples that will evoke an interactive shell that is not a login shell.
ssh user@host /path/to/command
In this case of an interactive but non-login shell, only ~/.bashrc is executed. In most cases, the default ~/.bashrc script executes the system’s /etc/bashrc.
Be warned that you should never echo output to the screen in a ~/.bashrc file. Otherwise, commands like ‘ssh user@host /path/to/command’ will echo output unrelated to the command called.
Non-interactive shells do not automatically execute any scripts like ~/.bashrc or ~/.bash_profile. Here are some examples of non-interactive shells.
su user -c /path/to/command
bash -c /path/to/command
For more information, see the bash man page.