I've seen others add all this information to their PS1 prompt.

I like the approaches that colorize the elements and also do a carriage return at the end.


3 Answers 3


I use quite a complex PS1 line on my machine. The following set of code creates my PS1 line. Place it in your bashrc file if you wish to use it. I'm not sure if it works on OSX systems, but my guess would be no.

source "/usr/share/git/completion/git-prompt.sh"




BATT="\$(acpi -b | awk '{print \$4}' | cut -b1-3)"
FILES_STAT="\$(ls -1 | wc -l | sed 's: ::g')"
FILES_SIZE="\$(ls -lah | grep -m 1 total | sed 's/1:total //')b"
GIT_PS1='$(__git_ps1 "(%s)")'

if [ $UID -eq 0 ]; then
PS1='\[\e[0;31m\]\u\[\e[m\]\[\e[1;37m\]@\h\[\e[m\] \[\e[1;34m\]\W\[\e[m\] \[\e[1;32m\]\$\[\e[m\] \[\e[1;32m\]'
elif [ -n "$SSH_CLIENT" ]; then
    PS1='\[\e[0;31m\](SSH)\[\e[m\]\[\e[1;37m\]\u@\h\[\e[m\] \[\e[1;34m\]\W\[\e[m\] \[\e[1;32m\]$(acpi -b | awk "{print \$4}" | cut -b1-3) $(__git_ps1 "(%s) ")\$\[\e[m\] \[\e[1;32m\]'
trap 'echo -ne "\e[0m"' DEBUG

I'm currently at work and do not have the above PS1 line set on this machine. I'll update this answer with a screenshot of how it looks once I get back. But till then let me try to explain what this does:

  1. We source git's completion script. They have a similar one for zsh in the same location. This gives us the important __git_ps1 function for use in the PS1 line. This script outputs nothing if you're not in a git repository.
  2. Set some variables to define what kind of information about the git branches is shown on the PS1 line.
  3. I set a few variables to make it easy to manage the huge PS1 line I have. Those escape characters I have draw angluar lines on the console. The SH_* variables are shortvuts for colours. They are ANSI sequences which will cause the terminal to display coloured output. Finally we set some variables which are perform some actions, like get battery status and number of files in current directory.
  4. Here we define the actual PS1 lines. Since I use this setup globally, I first check to see if the current user is root or not. For root, I have a very simple PS1 line which displays the username in red. If you're connecting via SSH, you don't want such a complex line and hence, we again display something simpler. Else, display the complete PS1 line. It can take a while to understand this line. It's a 2-line PS1 which displays a whole lot of information.
  5. The last line, trap ... is required so that the colour settings don't bleed out into all the output. The last ${SH_GREEN} causes my input to be in green colour. However, I don't want all the output from all the programs to be coloured green too. Hence, the trap statement.


  • Did you ever get that screenshot? Commented May 19, 2015 at 7:33
  • 1
    I think adding current date to console prompt is simply too much! Commented Aug 30, 2015 at 2:00


enter image description here

Add this to the .bashrc file

parse_git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(parse_git_branch)\[\033[00m\]\n\$ '

This will work on both Ubuntu and OSX. Note that I have to have the HOST 'built' on two lines to show the same way in both Linux and OSX. Didn't figure out the reason why but it works.

Note the use of the "_" directory which helps prevent long directory nesting from pushing the prompt to 2 lines by only showing top 3 and bottom 3 directories. less than 7 it just shows them all.

  • 1
    Note that this won't work on a stock OSX unless you add the lines to .profile or .bash_profile instead of .bashrc or you source .bashrc from .profile.
    – terdon
    Commented May 4, 2014 at 13:40
  • Good point. I source it from .bash_profile so it's the same on both. In .bash_profile I put anything that is mac or work specific. Commented May 4, 2014 at 14:03
  • I followed your example and made my own scheme in Debian :) Big thanks! Commented Aug 30, 2015 at 1:53


PS1_TIME='\033[01;31m\]\t \033[01;32m\]'
parse_git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
PS1_GIT=' \[\033[00;33m\]$(parse_git_branch)\[\033[00m\]\]'


enter image description here `

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .