You are on page 1of 10

Customize Your Shell & Command

Prompt
Posted on 2012 June 13
As mentioned in a previous post, we received some new MacBooks and a Mac Mini at
work. Since most of my team prefers using PCs, I was able to get my hands on one. I
immediately noticed how di!erent it was from the one I use at home, so I started
customizing it right away. I found I had forgotten how to do a couple things and it took me
longer than I would have liked to search the web, so Ive decided to dedicate a short post
on how to customize your shell and command prompt in Mac OS X.
If you use Linux or Windows (think cygwin or git bash) this may apply to you too. If you dont
use any sort of shell, well, then you might just want this for future reference.
Apps
Terminal is the default app that comes with Mac OS X. Another great app is iTerm 2 (Free).
It adds a lot of functionality that some users nd lacking in Terminal.
General Preferences
Some programs that run the shell allow you to set the window size and bu!er (essentially
scrolling inside the limitations of the window). This is really helpful to setup before hand
since lines that are too long will word wrap if you dont have a large window bu!er. This will
inevitably happen at some point and its really annoying when it does, so take steps to
prevent it now.
If you nd you navigate to a specic directory every time you open the shell, it may be a
good idea to tell the app to navigate to that directory when you open the shell. In Terminal,
this can be found at Preferences >> Settings >> Shell; in iTerm 2 this can be found at
Preferences >> Profiles >> General. There are a lot of other cool features (like window
Taylor McGann's Blog
A record of tech tips & tricks I stumble upon dailyand
then some.
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
1 of 10 12/13/13, 10:38 PM
groupings) that you should checkout.
Appearance
The next thing youre going to want to do is customize your shells color. I like the traditional
black background with white or light gray text and some colorful highlighting like green or
even just a plain grey.
For my shells font, I like to use Monaco 10pt. Smaller text lets me see more on the screen
since I usually only let my shell take up one half of the screen. I enable bold fonts and bright
colors for bold fonts, but I disable anti-aliasing (smooth edges) because I like that raw
hacker feel ;).
Prole (or Bashrc)
For me, some of the most important customization takes place in the .prole le. Every time
your shell loads, it will run the commands found in .prole. In Mac OS X, there are other
versions of this le that are global (not user specic) found at /etc/profile and
/etc/bashrc. Linux often uses .bash_profile or .bashrc les. The next four
sections will discuss:
How to change prompt escapes (bash)
How to change prompt color (bash)
How to create your personal bin
How to create aliases
Change Prompt Escapes
First, I like to customize the prompte e. I cant stand it when the prompt is white and blends
in with the rest of the text in the shell. The appearance of the prompt is stored in the
environment variable $PS1. Try typing echo $PS1 in your shell. The text you see is a
string coded with the display setting for your shells prompt. It might look something like
this:
\h:\W \u$
In this example, the \h represents the host computer, \W the working directory and \u the
current user. All this information makes sense if you were to use the CLI a lot. Back in the
old days, people would interface between various servers or computers over a network
(esp. in business scenarios). When youd change to a di!erent server, youd want to know
the host computer you were accessing. Not all the computers had GUIs. Thus \h would
let you know which computer you were on; whether you were on yours or another.
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
2 of 10 12/13/13, 10:38 PM
The \u is common for similar reasons. Sometimes you use the su command to substitute
user and youll want to know which user you are acting as.
The \W should be self explanatory. You dont want to have to type pwd or ls all the time to
know where you are at in the le hierarchy.
In my prompt, Ive gotten rid of the host symbol (I dont switch hosts often and when I do,
the other prompt is usually di!erent enough that I can tell Im on a di!erent machine) and
replaced it with the history number prompt escape (\!). This escape lets you know which
number in the command history you have just typed. That way if you see a previous
command that youd like to repeat a couple lines up you just type !<number>. To view
your complete command history, type the command history. A simplied version of my
prompt looks like this:
\! \u:\W$
Heres a comprehensive list of prompt escapes to add to your prompt:
\a # an ASCII bell character (07)
\d # the date in "Weekday Month Date" format (e.g., "Tue May 26")
\D{format} # the format is passed to strftime(3) and the result
# is inserted into the prompt string an empty format
# results in a locale-specific time representation.
# The braces are required
\e # an ASCII escape character (033)
\h # the hostname up to the first '.'
\H # the hostname
\j # the number of jobs currently managed by the shell
\l # the basename of the shell's terminal device name
\n # newline
\r # carriage return
\s # the name of the shell, the basename of $0 (the portion following
# the final slash)
\t # the current time in 24-hour HH:MM:SS format
\T # the current time in 12-hour HH:MM:SS format
\@ # the current time in 12-hour am/pm format
\A # the current time in 24-hour HH:MM format
\u # the username of the current user
\v # the version of bash (e.g., 2.00)
\V # the release of bash, version + patch level (e.g., 2.00.0)
\w # the current working directory, with $HOME abbreviated with a tilde
\W # the basename of the current working directory, with $HOME
# abbreviated with a tilde
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
3 of 10 12/13/13, 10:38 PM
\! # the history number of this command
\# # the command number of this command
\$ # if the effective UID is 0, a #, otherwise a $
\nnn # the character corresponding to the octal number nnn
\\ # a backslash
\[ # begin a sequence of non-printing characters, which could be used
# to embed a terminal control sequence into the prompt
\] # end a sequence of non-printing characters
Change Prompt Color
To color code your prompt on a Mac, use the following template:
\[\033[COLOR_CODE_HERE\]PROMPT_ESCAPE_OR_TEXT_HERE\[\033[0m\]
Most Linux distributions use a little di!erent format:
\e[COLOR_CODE PROMPT_ESCAPE\e[0m
The rst portion before the desired prompt escape or text only begins painting the chosen
color (e.g., \[\033[1;34m\]). To stop painting a color, you have to reset to another
color or turn color o! (e.g., \[\033[0m\]).
Here's a comprehensive list of color encoding:
# Regular Colors
\[\033[0;30m\] # Black
\[\033[0;31m\] # Red
\[\033[0;32m\] # Green
\[\033[0;33m\] # Yellow
\[\033[0;34m\] # Blue
\[\033[0;35m\] # Purple
\[\033[0;36m\] # Cyan
\[\033[0;37m\] # White
# High Intensty
\[\033[0;90m\] # Black
\[\033[0;91m\] # Red
\[\033[0;92m\] # Green
\[\033[0;93m\] # Yellow
\[\033[0;94m\] # Blue
\[\033[0;95m\] # Purple
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
4 of 10 12/13/13, 10:38 PM
\[\033[0;96m\] # Cyan
\[\033[0;97m\] # White
# Background
\[\033[40m\] # Black
\[\033[41m\] # Red
\[\033[42m\] # Green
\[\033[43m\] # Yellow
\[\033[44m\] # Blue
\[\033[45m\] # Purple
\[\033[46m\] # Cyan
\[\033[47m\] # White
# High Intensty backgrounds
\[\033[0;100m\] # Black
\[\033[0;101m\] # Red
\[\033[0;102m\] # Green
\[\033[0;103m\] # Yellow
\[\033[0;104m\] # Blue
\[\033[10;95m\] # Purple
\[\033[0;106m\] # Cyan
\[\033[0;107m\] # White
#Replace any leading leading 0; with 1; for bold colors
#Replace any leading 0; with 4; to underline
Once you've decided on the appropriate prompt add export PS1="<custom
prompt>" to your .profile. For example, this is what the line in my .profile looks
like:
export PS1="\[\033[1;34m\]\!\[\033[0m\] \[\033[1;35m\]\u\[\033[0m\]:\[\033[1;35m
Add Personal "bin" to the PATH Variable
Every now and again you may want to create your own custom commands, scripts or
programs for the CLI. Instead of mixing these in with the rest of the OS's, just create your
own personal "bin" folder and add it to your PATH variable so that you can run those
commands from any folder in the shell.
export PATH=$PATH:/Users/Taylor/bin
Create & Use Aliases
Aliases are really nifty. They can save you a lot of extra e!ort for frequently used and/or
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
5 of 10 12/13/13, 10:38 PM
lengthy commands. For example, I found that I liked to use ls -lhaG a lot more than just
ls as follows:
alias ls='ls -lhaG'
Alias long commands that you'd forget or never want to type. I use Git to version my code.
The git log command is very powerful and can include a lot of options. Instead of
typing the various options every time, I use an alias called glg:
alias glg='git log --date-order --all --graph --format="%C(green)%h%Creset %C(ye
Conclusion
At the end of the day, this is what my .profile looks like:
*UPDATED 2012-09-28: As per Jared's excellent comment.*
##################
### MY ALIASES ###
##################
# git command autocompletion script
source ~/bin/git-completion.bash
# git commamands simplified
alias gst='git status'
alias gco='git checkout'
alias gci='git commit'
alias grb='git rebase'
alias gbr='git branch'
alias glg='git log --date-order --all --graph --format="%C(green)%h%Creset %C(ye
alias glg2='git log --date-order --all --graph --name-status --format="%C(green)
# ls alias for color-mode
alias ls='ls -lhaG'
# lock computer
alias lock='/System/Library/CoreServices/"Menu Extras"/User.menu/Contents/Resour
# up 'n' folders
alias ..='cd ..'
alias ...='cd ../..'
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
6 of 10 12/13/13, 10:38 PM
Share:
Like this:
Be the rst to like this.
alias ....='cd ../../..'
alias .....='cd ../../../..'
# simple ip
alias ip='ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2'
# more details
alias ip1="ifconfig -a | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print
# external ip
alias ip2="curl -s http://www.showmyip.com/simple/ | awk '{print
# grep with color
alias grep='grep --color=auto'
# proxy tunnel
#alias proxy='ssh -D XXXX -p XXXX USER@DOMAIN'
# ssh home
#alias sshome='ssh -p XXXX USER@DOMAIN'
# processes
#alias ps='ps -ax'
# refresh shell
alias reload='source ~/.profile'
###############################
### ENVIRONMENTAL VARIABLES ###
###############################
# Add personal bin to PATH variable
export PATH=$PATH:/Users/Taylor/bin # May be redundant; check ~/.bash_profile
# Change prompt
PS1_OLD=${PS1}
export PS1='\[\033[1;34m\]\!\[\033[0m\] \[\033[1;35m\]\u\[\033[0m\]:\[\033[1;35m
What have you done to customize your shell or change your command prompt?
This entry was posted in Technology and tagged Bash, Bash Prole, Bashrc, CLI,
Command Line Interface, Command Prompt, Cygwin, iTerm, Linux, Mac OS X,
Prompt Color, Prompt Escape, Shell, Terminal by Taylor. Bookmark the permalink
[http://blog.taylormcgann.com/2012/06/13/customize-your-shell-command-
prompt/] .
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
7 of 10 12/13/13, 10:38 PM
10 THOUGHTS ON CUSTOMIZE YOUR SHELL & COMMAND PROMPT
Jared
on 2012 June 13 at 10:30 PM said:
alias ..=cd ..
alias =cd ../..
alias .=cd ../../..
alias ..=cd ../../../..
alias sup=svn update
alias sco=svn checkout
alias sci=svn commit
alias ls=ls -Gl
alias lsh=ls -Gal
alias nder=open .
alias back=cd -
alias clr=clear
# quicklook > ql photo.jpg
alias ql=qlmanage -p 2>/dev/null
# simple ip
alias ip=ifcong | grep inet | grep -v 127.0.0.1 | cut -d\ -f2"
# more details
alias ip1=ifcong -a | perl -nle/(\d+\.\d+\.\d+\.\d+)/ && print $1"
# external ip
alias ip2=curl -s http://www.showmyip.com/simple/ | awk {print $1}
alias ping=ping -c 5#
alias grep=grep color=auto
alias game=emacs -batch -l dunnet
# sleep computer
alias iSleep=osascript -e tell application Finder to sleep
alias history=history
# folder shortcuts
alias logs =cd /User/Jared/JBoss/jboss-4.2.2/server/logs
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
8 of 10 12/13/13, 10:38 PM
Pingback: Autocomplete Git Commands & Git Aliases | Taylor
McGann's Blog
Pingback: Install and Setup Cygwin | Taylor McGann's Blog
#
# proxy tunnel
alias proxy=ssh -D XXXX -p XXXX USER@DOMAIN
# ssh home
alias sshome=ssh -p XXXX USER@DOMAIN
# processes
alias ps=ps -ax
# refresh shell
alias reload=source ~/.bash_prole
Taylor McGann
on 2012 June 13 at 10:34 PM said:
A very nice addition indeed! Thanks for posting.
Joshua
on 2012 June 14 at 8:41 AM said:
Awesome post Taylor! iTerm 2 is the bomb.
Jared
on 2013 April 6 at 12:55 PM said:
best terminal prompt: http://farm9.staticickr.com
/8125/8613382541_48fa08aaea_b.jpg
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
9 of 10 12/13/13, 10:38 PM
Pingback: Custom OSX bash prompt | Je!rey Urban
Pingback: Increasing Bash Prompt Awesome on your Mac |
PareidoliaX
Brent Danley
on 2013 August 21 at 9:04 PM said:
This is excellent. I really like the up n and git aliases. Came looking for prompt
customization and found much more goodness. Thanks.
Todor
on 2013 October 16 at 12:36 PM said:
\D format documentation is listed here:
https://developer.apple.com/library/mac/documentation/Darwin/Reference
/ManPages/man3/strftime.3.html
And this is my custom prompt:
export PS1=\D{%Y%m%d-%T}-\[33[0;36m\]\u\[33[0;31m\]@\h \[33[0;33m\][ \W/
] \[33[0;37m\]$\[33[0m\]
Customize Your Shell & Command Prompt | Taylor McGann'... http://blog.taylormcgann.com/2012/06/13/customize-your-she...
10 of 10 12/13/13, 10:38 PM

You might also like