Here is my bash prompt, with the following features:

Red ✘ and errorcode if command has failed, otherwise a green ✔.

git status (if available)

end time of last command

precise elapsed time of the previous command

red hostname for root

Separate line for path and command

Subversion support

Example

Installation

Add this to your ~/.bashrc :

function prompt_timer_start { PROMPT_TIMER = ${ PROMPT_TIMER :- ` date +%s.%3N ` } echo -ne " \0 33]0; ${ @ } \0 07" } function prompt_svn_stats () { command -v svn > /dev/null if [ $? != 0 ] ; then return fi local WCROOT = ` svn info --show-item wc-root 2>/dev/null ` if [ -z " $WCROOT " ] ; then return fi local SVN_INFO = ` svn info ${ WCROOT } 2>/dev/null ` local CHECKEDOUTURL = ` echo " ${ SVN_INFO } " |sed -ne 's#^URL: ##p' ` local REV = ` echo " ${ SVN_INFO } " |sed -ne 's#^Revision: ##p' ` local ROOTURL = ` echo " ${ SVN_INFO } " |sed -ne 's#^Repository Root: ##p' ` echo " ( \e [32m ${ CHECKEDOUTURL / $ROOTURL \// } \e [1; [email protected] \e [0;100m ${ REV } )" } function prompt_timer_stop { local EXIT = " $? " # MUST come first local NOW = ` date +%s.%3N ` # should be high up, for accurate measurement echo -ne " \0 33]0; $USER @ $HOSTNAME : $PWD \0 07" local ELAPSED = $( bc <<< " $NOW - $PROMPT_TIMER " ) unset PROMPT_TIMER local T = ${ ELAPSED %.* } local AFTER_COMMA = ${ ELAPSED ##*. } local D = $(( T/60/60/24 )) local H = $(( T/60/60%24 )) local M = $(( T/60%60 )) local S = $(( T%60 )) local TIMER_SHOW = [[ $D > 0 ]] && TIMER_SHOW = ${ TIMER_SHOW }$( printf '%dd ' $D ) [[ $H > 0 ]] && TIMER_SHOW = ${ TIMER_SHOW }$( printf '%dh ' $H ) [[ $M > 0 ]] && TIMER_SHOW = ${ TIMER_SHOW }$( printf '%dm ' $M ) TIMER_SHOW = ${ TIMER_SHOW }$( printf "%d. ${ AFTER_COMMA } s" $S ) PS1 = " \e [0m

" # begin with a newline if [ $EXIT != 0 ] ; then PS1+ = " \e [1;41m ✘ ${ EXIT } " # red x with error status else PS1+ = " \e [1;42m ✔" # green tick fi PS1+ = " \e [0;100;93m ` date +%H:%M ` " # date, e.g. 17:00 #local PSCHAR="┕▶" local PSCHAR = "▶" if [ $( id -u ) -eq 0 ] ; then PS1+ = " \e [1;31m \h " # root: red hostname PSCHAR = " \e [1;31m# \e [0m" else PS1+ = " \e [1;32m \h " # non-root: green hostname fi PS1+ = " \e [1;94m \w " # working directory GIT_PS1_SHOWDIRTYSTATE = true # * unstaged, + staged GIT_PS1_SHOWSTASHSTATE = true # $ stashed GIT_PS1_SHOWUNTRACKEDFILES = true # % untracked GIT_PS1_SHOWCOLORHINTS = true # < behind, > ahead, <> diverged, = same as upstream GIT_PS1_SHOWUPSTREAM = "auto" # git with 2 arguments *sets* PS1 (and uses color coding) __git_ps1 " ${ PS1 } \e [0;100m" " \e [0;100m" # try to append svn PS1+ = ` prompt_svn_stats ` PS1+ = " \e [0;100;93m ${ TIMER_SHOW } " # runtime of last command PS1+ = " \e [0m

${ PSCHAR } " # prompt in new line #PS1+="\e[K\e[0m

${PSCHAR} " # prompt in new line } # see https://gnunn1.github.io/tilix-web/manual/vteconfig/ if [ $TILIX_ID ] || [ $VTE_VERSION ] ; then source /etc/profile.d/vte.sh fi trap 'prompt_timer_start "$BASH_COMMAND (`date +%H:%M:%S`)"' DEBUG PROMPT_COMMAND = prompt_timer_stop

2016-11-04 : Initial version

: Initial version 2017-04-28 : Now prints days, hours, minutes, seconds. Much better readable for long running tasks.

: Now prints days, hours, minutes, seconds. Much better readable for long running tasks. 2017-08-02 : Adds root as red, git status, error code, time.

: Adds root as red, git status, error code, time. 2017-08-03 : Adds subversion support.

: Adds subversion support. 2017-08-06 : much faster if subversion is not installed, show running command in titlebar

: much faster if subversion is not installed, show running command in titlebar 2018-10-26: better color coding

Sources