To make an alias for the Terminal in OS X, you can either put the aliases in
.bashrc. What is the difference between the two and why would I choose to put aliases in one and not the other?
.bash_profile is executed for login shells, while
.bashrc is executed for interactive non-login shells.
When you login (type username and password) via console, either sitting at the machine, or remotely via ssh:
.bash_profile is executed to configure your shell before the initial command prompt.
But, if you’ve already logged into your machine and open a new terminal window (xterm) then
.bashrc is executed before the window command prompt.
.bashrc is also run when you start a new bash instance by typing
/bin/bash in a terminal.
On OS X, Terminal by default runs a login shell every time, so this is a little different to most other systems, but you can configure that in the preferences.
X11 will look at your
.bashrc while a "regular" Terminal will look at
However, if you add the following to your
.bash_profile, you can then move everything into your
.bashrc file so as to consolidate everything into one place instead of two:
if [ -f $HOME/.bashrc ]; then source $HOME/.bashrc fi
For macOS, the code to put into
.bash_profile to consolidate everything into
.bashrc is the following:
if [ -f ~/.bashrc ]; then source ~/.bashrc fi
This is more specific for Mac terminal user.
.bash_profile for your aliases.
The way the different initialisation files work together is a bit more complicated, and there are some important special cases in OSX. Here are the highlights:
- Bash, on any platform, executes one of several different files depending on how it is invoked. The details are here.
- OSX's Terminal App does something non-standard: it creates every new tab or window as if it were a login shell, which means that
.bash_profileis called. Thus the TLDR advice above.
.bashrcis also an option, but that will be called every time you create a subshell (i.e., invoke
bash), which can create inefficiency if you update a variable within it (e.g.,
- Other apps that have embedded terminals can choose to follow Terminal App's convention or not. Notably, Visual Studio Code, by default, does not.
- Apps invoked via the GUI are not spawned from a shell. Thus, there are several competing mechanisms for setting environment variables for them to see, which have changed over the years.
- Snippets that call
.bash_profileare quite common. I don't recommend that, but it is a preference.