168

The code in .bashrc does not execute when I open a new terminal window in Ubuntu 12.04. I noticed this when creating a .bash_aliases file. The aliases did not show up when I opened a new terminal. However when I type source .bashrc the aliases did show up.

.bashrc should be run every time I open a new terminal window, right?

How do I make this happen?

chicks
  • 572
  • 8
  • 24
Selah
  • 2,815
  • 2
  • 26
  • 31

7 Answers7

234

It isn't necessarily run; at the top of the standard .bashrc is this comment:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

I believe there is an option to run bash terminal as a login shell or not. With Ubuntu, gnome-terminal does not normally run as a login shell, so .bashrc should be run directly.

For login shells (like the virtual terminals), normally the file ~/.profile is run, unless you have either ~/.bash_profile or ~/.bash_login, but they are not there by default. By default, Ubuntu uses only .profile.

The standard ~/.profile has this in it:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

This runs .bashrc if it is available - assuming $BASH_VERSION is present in your environment. You can check for this by entering the command echo $BASH_VERSION, and it should display some information on version number - it should not be blank.

Marty Fried
  • 18,026
  • 5
  • 51
  • 52
  • 4
    After understanding these instructions, I went in my terminal application I went to edit -> profile preferences -> Title and Command -> Run command as a login shell. I unchecked this. Thanks for the help. – Selah Oct 08 '12 at 16:36
  • Can you clarify when .profile (hence .bashrc) is loaded/read? It seems this is done when the users logs in to their desktop session. The answer suggests this occurs when you start a new terminal/shell session "For login shells (like the virtual terminals), normally the file ~/.profile is run... " – hedgehog Jan 07 '13 at 04:48
  • 5
    It is _normally_ run when you start a new login shell (not really desktop session, because you can run a new login shell from the desktop session). As I said, it is run by default, but not if you have created `~/.bash_profile` or `~/.bash_login`. You can test by checking or unchecking the checkbox in `Edit -> Profile Preferences -> Title and Command -> "Run command as a login shell`, and exit then rerun the terminal. You could echo something from .profile to test. – Marty Fried Jan 07 '13 at 21:23
  • @Selah Your comment helped me more then the actual answer ;) thanks a lot for making the comment! – Aleks Jan 14 '14 at 12:18
  • 2
    So if you have created `~/.bash_profile` or `~/.bash_login` on your system and want to keep them, but still want `~/.profile` and from there `~/.bashrc` executed, you can source it from your own `~/.bash_profile` or `~/.bash_login` with a line containing `source "$HOME/.profile"`. Gives you back the colored output of ls also in login shells! – tanius Mar 02 '14 at 11:40
  • 1
    Thank you for this post... just an FYI, this worked on RHEL also... – jasonflaherty Oct 12 '21 at 16:04
  • @jasonflaherty - glad it helped after such a long time. I'm not really surprised it also works with other distros - it's fairly basic. – Marty Fried Oct 13 '21 at 19:39
  • just realized my terminal was loading zsh instead of bash! changed .zshrc to source aliases from .bash_aliases – Omkar76 Aug 29 '22 at 06:56
69

In my case, simply the .bashrc loader lines were missing in .bash_profile

# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
fi

I added it manually and it worked with my fresh login

user3584014
  • 791
  • 5
  • 2
17

.bash_profile holds configuration for the bash shell. When you open a terminal, it first reads and executes commands from ~/.bash_profile. So you can add the following in .bash_profile to setup the shell according to bashrc.

. ~/.bashrc
muru
  • 193,181
  • 53
  • 473
  • 722
SD.
  • 271
  • 2
  • 4
  • Unless your terminal is running a login shell (which it doesn't by default in Ubuntu), `~/.bash_profile` won't be read (and it doesn't exist by default in Ubuntu) – muru Jan 10 '17 at 05:49
9

According to the comment in .profile

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.

So there you go; if ~/.bash_profile or ~/.bash_login exists, those will get run instead of ~/.profile.

If you want to run ~/.bashrc just add the line source ~/.bashrc in bash_profile.

Zanna
  • 69,223
  • 56
  • 216
  • 327
Nic Wanavit
  • 386
  • 3
  • 8
  • 1
    I have experienced the exact same issue. My `.bashrc` was being sourced until I created a `.bash_profile` file. So I prepended `source ~/.bashrc ` line to my `.bash_profile` file. – Lashae Aug 29 '19 at 06:22
7

If $BASH_VERSION is not set, try using the chsh command to set your shell to /bin/bash.

I had a similar issue with 12.04 LTS, and it turned out the new user account had the default shell set to /bin/sh, which was the cause of the problem.

evan_b
  • 170
  • 1
  • 4
4

It was pretty simple for me. I installed mssqltools and somehow it created a file bash_profile in $HOME directory. As bash_profile runs before bashrc is picked up, if you don't have a source command in bash_profile, bashrc won't run.

There are two ways to tackle this, either delete bash_profile or if you use bash_profile, just add the following line anywhere in the file

source ~/.bashrc
Zanna
  • 69,223
  • 56
  • 216
  • 327
redzack
  • 145
  • 5
1

On Ubuntu 20.x in order for the .bashrc to be read when a terminal is opened, you should copy the template .profile into the user directory (.bashrc is loaded from .profile):

sudo cp /etc/skel/.profile ~/.profile && sudo chown $(whoami):$(whoami) ~/.profile