What happens exactly when I type 'bash' on the Terminal command line on Mac OSX?
I have an alias that I've added to .bashrc, and it only activates in Terminal after I run the 'bash' command. I feel like I should know what's happening here, but I don't. :)
Depending on the version of OS X you are using your default shell might not be bash. You can verify this by typing(before you run 'bash'):
$ echo $SHELL
/bin/zsh
You can change your default shell to bash so you don't have to keep running the command by following the instructions here:
https://serverfault.com/questions/21044/how-do-i-change-a-users-default-shell-in-osx
From @chopper3
for <=10.4 - netinfo manager, /users/whoever/shell
for 10.5=> - SysPrefs, accounts, control-click on user, select advanced options, edit login shell field.
To further answer your question, the .bashrc is only used by the bash shell. If you want you can figure out what shell you are using and add the alias to the .tcshrc or .zshrc instead of changing everything to use bash.
More info on what a shell is:
http://en.wikipedia.org/wiki/Shell_(computing)
and bash specifically:
http://en.wikipedia.org/wiki/Bash_(Unix_shell)
From man bash
:
When an interactive shell that is not a login shell is started, bash reads and executes commands from
~/.bashrc
, if that file exists.
Emphasis mine
On OS X, all Terminal windows and tabs run login shells, which is equivalent to you running bash --login
instead of bash
. ~/.bashrc
is therefore ignored, unless explicitely source
d from e.g. ~/.bash_profile
:
When bash is invoked as an interactive login shell, [...] 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.
Just create ~/.bash_profile
if it doesn't exist, and add the following line:
. .bashrc
Then .bashrc
will be loaded even for login sessions.
The alias doesn't work after you run bash
- it works while you're running bash
.
Basically, ~/.bashrc
is a file that contains directives that are run by bash
every time it's started. The default shell for all recent versions of Mac OS X is bash
, so it's run every time you open a Terminal. bash
does not, however, magically know to re-read its configuration files when you edit them, so the alias doesn't immediately work when you add it to ~/.bashrc
. What you do when you run bash
in your existing shell is create another instance of bash
(which will read the modified configuration file, because it's starting up). Note that your original instance of bash
is still there, running behind the bash
you ran manually. If you close the shell (with the exit
command) you'll return to your original shell (if you close it, you'll get a "process completed" message from the terminal).
So, to get back to your problem: your alias won't work until bash
re-reads its configuration. You can do this by starting bash
again (either by creating another shell inside your existing shell by running bash
, or by closing and opening your terminal) or, you can use the source
command to get bash
to re-read a file. So, after you've edited ~/.bashrc
, do source ~/.bashrc
- alias working, no starting bash
again.