Read more

Customize your Bash prompt

Avatar
Dominik Schöler
March 22, 2011Software engineer at makandra GmbH

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\]
Illustration online protection

Rails Long Term Support

Rails LTS provides security patches for old versions of Ruby on Rails (2.3, 3.2, 4.2 and 5.2)

  • Prevents you from data breaches and liability risks
  • Upgrade at your own pace
  • Works with modern Rubies
Read more

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

Avatar
Dominik Schöler
March 22, 2011Software engineer at makandra GmbH
Posted by Dominik Schöler to makandra dev (2011-03-22 11:38)