Customize your Bash prompt

The shell variable PS1 holds your bash prompt. You might want to change it to serve your needs best. Here is how to:

General

Information

  • \u: current username

  • \h: hostname up to the first ., \H: full hostname

  • \w: current working directory, \W: same, but only the basename

  • $(__git_ps1 "%s"): your current git branch if you're in a git directory, otherwise nothing

  • \$: if the effective UID is 0: #, otherwise $

  • \d: the date in "Weekday Month Date" format (e.g., "Tue May 26")

  • \t: the current time in 24-hour HH:MM:SS format, \T: same, but 12-hour format, @: same, but in 12-hour am/pm format

  • \n: newline

  • \r: carriage return

  • \\: backslash

Colors & Styles

  • colors have to be escaped (see General), color codes should be followed by an m
  • put \[\e[‹code›m\] and \[\e[0m\] around the part of your prompt you want to style
  • where ‹code› is a ;-chain of:
    • x: attribute of the text
    • 3y: foreground color
    • 4y: background color
  • x:
    • 0: normal
    • 1: bold
    • 4: underline
    • 7: reverse
  • y is the color:
    • 0 black
    • 1 red
    • 2 green
    • 3 yellow
    • 4 blue
    • 5 magenta
    • 6 cyan
    • 7 white
  • example: \[\e[0;33m\]prompt:\[\e[0m\]

Save your settings by writing export PS1='...' to your .bashrc or .profile.

Examples

export PS1='\h \w$(__git_ps1 "(%s)") \$ '
=> mycomputer ~/apps/chess/tmp(master) $ _

export PS1='\[\e[33m\]\h\[\e[0m\]:\W\[\e[33m\]$(__git_ps1 "(%s)")\[\e[0m\] \u\$ '
=> mycomputer:tmp(master) tom$ _

# Henning's awesome TRON prompt 2.0.2 with current Git branch and success state of the last command (the syntax coloring here does not do it justice):
export PS1='`if [ $? = 0 ]; then echo "\[\033[01;32m\]✔"; else echo "\[\033[01;31m\]✘"; fi` \[\033[01;30m\]\h\[\033[01;34m\] \w\[\033[35m\]$(__git_ps1 " %s") \[\033[01;30m\]>\[\033[00m\] '
=> ✔ mycomputer ~/projects/platforms master > _

# Arne's epic timestamped prompt with return status indicator and status-colored (green if fresh, or red if unstaged, or yellow if staged) git branch:
export PS1='\[\e[01;30m\]\t`if [ $? = 0 ]; then echo "\[\e[32m\] ✔ "; else echo "\[\e[31m\] ✘ "; fi`\[\e[00;37m\]\u\[\e[01;37m\]:`[[ $(git status 2> /dev/null) =~ Changes\ to\ be\ committed: ]] && echo "\[\e[33m\]" || echo "\[\e[31m\]"``[[ ! $(git status 2> /dev/null) =~ nothing\ to\ commit,\ working\ .+\ clean ]] || echo "\[\e[32m\]"`$(__git_ps1 "(%s)\[\e[00m\]")\[\e[01;34m\]\w\[\e[00m\]\$ '
=> 03:13:37 ✔ arne:(master)~/projects/geordi$ _

# Arne's danger prompt for root use. No git information and alarming red and yellow (which you can't see here):
export PS1='\[\e[01;30m\]\t \[\e[31m\]\u\[\e[37m\]:\[\e[33m\]\w\[\e[31m\]\$\[\033[00m\] '
=> 03:13:37 root:/tmp/foo# _

# Kim's mix of those above with small changes. TRON promt with timestamp, return status indicator, hostname, git informations and working directory (but all non-bold).
export PS1='\[\033[01;30m\]\t `if [ $? = 0 ]; then echo "\[\033[01;32m\]ツ"; else echo "\[\033[01;31m\]✗"; fi` \[\033[00;32m\]\h\[\033[00;37m\]:\[\033[31m\]$(__git_ps1 "(%s)\[\033[01m\]")\[\033[00;34m\]\w\[\033[00m\] >'
=> 03:13:37 ツ mycomputer:(master)~/code/foo >_

# Kim's root prompt (the same as above without git and the hostname is red)
export PS1='\[\033[01;30m\]\t `if [ $? = 0 ]; then echo "\[\033[01;32m\]ツ"; else echo "\[\033[01;31m\]✗"; fi` \[\033[00;31m\]\h\[\033[00;37m\]:\[\033[00;34m\]\w\[\033[00m\] >'
=> 03:13:37 ツ mycomputer:~/code/foo >_

# Martin's prompt
export PS1='`if [ $? = 0 ]; then echo "\[\033[01;32m\]✔"; else echo "\[\033[01;31m\]✘"; fi` \[\033[01;30m\]\h\[\033[01;34m\] \w\[\033[35m\]$(__git_ps1 " %s") \[\033[01;31m\]\n>\[\033[00m\] '
=> ✔ mycomputer ~/code/foo master 
   > _

# Henning's danger prompt for root 2.1
export PS1='${debian_chroot:+($debian_chroot)}\[\033[43;30m\]\u@\h\[\033[00m\] \[\033[01;33m\]\w\[\033[00m\] \[\033[01;31m\]>\[\033[00m\] '
=> user@mycomputer ~/code/foo > _

# Klaus' modular prompt with git stash indicator
git_stash_size() {
  n=$( (git stash list 2> /dev/null || :) | wc -l )
  if [ $n -gt 0 ]; then
    echo -n " $n☰ "
  fi
}

normal='\[\033[00m\]'
red='\[\033[31m\]'
bright_yellow='\[\033[93m\]'
blue='\[\033[34m\]'
cyan='\[\033[36m\]'

status='`if [ $? = 0 ]; then echo "\[\033[01;32m\]✔"; else echo "\[\033[01;31m\]✗"; fi`'"$normal"
user_and_host="$blue"'`if [ $(whoami)="klaus" ]; then echo "k"; else echo "\u"; fi`@`if [ $(hostname)="Wheatley" ]; then echo "w"; else echo "\h"; fi`'"$normal"
branch="$red"'$(__git_ps1 "(%s)\[\033[01m\]")'"$normal"
directory="$cyan"'\w'"$normal"
stash="$bright_yellow"'$(git_stash_size)'"$normal"

export PS1="$status $user_and_host:$branch$directory$stash \$ "

# Niklas Hasselmeyer's warning if the ruby version has been changed via `rbenv shell`
if [ $RBENV_VERSION ]; then echo -n "\[\e[31m\][Ruby $RBENV_VERSION] \[\e[00m\]"; fi

See the attached screenshot for colorful examples of the above prompt settings (the user is arne on machine happycat in directory ~/code/geordi on the master branch).

Bash prompt examples.

Bash prompt with git stash indicator

Dominik Schöler About 13 years ago