Quick and dirty article whose only claim to fame is to show another example of treating a Mac running OSX a UNIX box: I have two Mac, an old Mini and a MacBook Air (I think I talked about it before). If you have been reading this blog, you expect me to use the shell a lot in them, and you would be right. One thing that annoys me is the default prompt used in both. The old, slow mini has the most useless one:
bash-3.2$ bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc. bash-3.2$
Why would I care about knowing at all times which bash version I am running, and even then it is incomplete info (compared to bash --version)? The MacBook Air is just slightly better, showing (in order) the name of the machine, the path, and then the username.
littleguy:~ raub$
It is similar in content to what I would see in my Linux boxes,
raub@desktop:~$but I do not like the order; it does not flow right in my eyes. So I am going to change both to look more like Linux.
First let's see how those prompts are defined in both machines; that is found by looking at the content of the environment variablePS1:
bash-3.2$ echo $PS1 \s-\v\$ bash-3.2$and
littleguy:~ raub$ echo $PS1 \h:\W \u\$ littleguy:~ raub$
From the official gnu page on controlling the Bash prompt, we know that
- \h : hostname
- \s : shell name
- \u : username
- \v : shell version
- \w : current working directory
- \$ : the generic symbol for users (as opposite to # for root)
bash-3.2$ PS1="\u@\h:\w\$ " raub@slowmac:~$
That seems to be exactly what I want. And, since it only exists in memory (i.e. did not commit it), if I did not like it, restarting the shell or opening a new tab in iTerm would brought it back to the original config. So, how do we make it permanent? In the slowmac, we have
raub@slowmac:~$ cat ~/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/opt/local/bin:/opt/local/sbin export PATH raub@slowmac:~$
So we might as well put it in the .bashrc file the lazy way.
cat >> ~/.bashrc << "EOF" PS1="\u@\h:\w\$ " EOF
Interestingly enough, the MacBook Air does not have a ~/.bash_profile. Maybe the slowmac did not have it either and I added it because I was developing programs in it a while ago. No problem, we can solve the MacBook Air problem by creating a ~/.bash_profile or just appending the proper lines to it, which is done the same was as we did to add the prompt lines to the slowmac's .bashrc:
cat >> ~/.bash_profile << "EOF" # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi EOF
Why do we put the prompt in the .bashrc instead of .bash_profile. You see, while ~/.bash_profile is executed when you login, ~/.bashrc is run whenever you start a new shell. By having our prompt defined in ~/.bashrc and then having ~/.bashrc called by ~/.bash_profile we cover our bases.
I am happy, but if you want to make your prompt fancier with colour and cows (really), I would suggest you to check a few more articles such as
In addition to the gnu page I mentioned above. Incidentally, everything I mentioned above should work with any Linux and UNIX distro using bash