The shell variable PS1
holds your bash prompt. You might want to change it to serve your needs best. Here is how to:
General
- non-printing escape sequences in your prompt have to be inclosed in
\[\e[
and\]
so your shell can correctly count its prompt's length - we recommend to highlight your prompt on production machines Show archive.org snapshot
- you can also show different root prompts for each user (if you not directly login with root)
- There are tools that may help you Show archive.org snapshot customize your bash prompt
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 currentgit
branch if you're in a git directory, otherwise nothing -
\$
: if the effective UID is0
:#
, 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).