Novell Home

Informative Bash Prompt

Novell Cool Solutions: Trench
By Christian Boltz

Digg This - Slashdot This

Posted: 1 Jun 2005
 

Informative bash prompt

The normal bash prompt in SUSE Linux contains the username, the machine name and the working directory. I don't need much more, but I like to have it clearer visible (colored). I also want to be informed if an application exited with exitcode > 0. Additionally, it's very useful to have username, hostname and the working directory in the xterm title.

This is my prompt:

cb@tux:/tmp> false
   [1]   cb@tux:/tmp> su
Password:
root@tux:/tmp>

You can see that the false command exited with status 1 as expected. You can also see that root sessions are highlighted separately.

How does this work?

I changed my prompt ($PS1) for the described features. The most important change is displaying the exitcodes if they are not zero. My /etc/bash.bashrc.local contains:

# PS1version=' \[\e[46m\]8.1\[\e[0m\]'
PS1error='$( ret=$? ; test $ret -gt 0 && echo "\[\e[41;93m\]   [$ret]   \[\e[0m\]" )'
PS1user="$( test `whoami` == root && echo '\[\e[101m\]' )\u\[\e[0m\]"
PS1color='\[\e[1;37;44m\]' # color of working directory
PS1="$PS1error$PS1user@\h:$PS1color\w\[\e[0m\]$PS1version> "
tty | grep pts > /dev/null && PS1="$PS1\[\e]0;\w - \u@\h\a\]";
export PS1

What do all those commands and variables do? I'll explain each step.

  • The (commented out) line PS1version is useful in chroot environments and helps me in looking through the different systems. If activated, the prompt contains the additional text 8.1 with cyan background.
  • PS1error prints the exitcode and its colored formatting - except if it was zero (= success). In this case, nothing is printed.
    The variable $ret is necessary because test changes $?.
  • PS1user displays the current username - normally unformatted, only root gets a light red background.
    The usage of whoami has the advantage of always telling the correct username. The bash-internal $USER variable is only correct with su - (or real logins), but not when just using su.
    By the way, $PS1user is expanded directly when parsing bash.bashrc.local - that means whoami is only called once in a session.
  • PS1color contains the color codes for highlighing of the working directory. The advantage of putting this in its own variable is that it can be changed easier.
    Tip: I use different colors on several machines and can recognice the xterms by color ;-)
  • The line PS1=... composes the "real" prompt. It puts all the PS1... variables together and adds some more details.
    Important: $PS1error is still not expanded here. It is evaluated each time the promt is shown.
  • Using tty | grep pts ... puts the working directory, username and host into a xterm's title bar - if you are in one. Otherwise, it changes nothing.
  • Finally the variable $PS1 gets exported (export $PS1) to be really useable.

Reading tips about this topic: man console_codes explains all the colorful parts of my prompt, man bash explains all about the promt in general. Additionally, the bash prompt howto is worth reading.

Available colors

for i in `seq 1 7 ; seq 30 48 ; seq 90 107 ` ; do 
    echo -e "\e[${i}mtest\e[0m$i" 
done

shows a list of available colors.

The colors 90-107 are not documented in man console_codes. Before using them, use the above loop to test if they are supported on your system.

Original URL (german): http://www.cboltz.de/de/linux/bashprompt


Novell Cool Solutions (corporate web communities) are produced by WebWise Solutions. www.webwiseone.com

© 2014 Novell