| ![[Photo of the Author]](../../common/images2/NicoGolde.jpg)  by  Nico Golde
 <nico/at/ngolde.de>
 
 About the author:
 
 At present Nico is still a student. Since a few years he
    keeps very busy with Linux, he also takes part in a number of
    Open Source Projects. 
 Translated to English by:
 Jürgen Pohl <sept.sapins(at)verizon.net>
 
 Content:
 | 
 
| Colorful Shells -- Using ANSI Color Codes  Abstract:
 
    In an ANSI compatible terminal (like xterm, rxvt, konsole ...)
    text may be shown in colors different from black/white. This
    article will demonstrate text in bold or in color.
    
_________________ _________________ _________________
 
 | 
     
General
    In real life every Linux user gets to face the Bash. At first
    glance that looks very boring, but there are many possibilities
    to give one's shell the personal touch. Colored enhancement of
    the shell prompt make the shell unique as well as better
    legible. 
    
    In my description I will refer to the Bash shell. The escape
    sequences may differ between terminals, for this text I am
    using an ANSI terminal.
     
Configuration of the Shell
    Setting of shell colors happens in the personal configuration
    file of the bash ~/.bashrc or in the global
    configuration file /etc/bashrc. The appearance of the
    prompt is being set with the PS1 variable in bashrc.
    
    
    Generally, the entry should look like this:
| 
~/.bashrc: PS1="\s-\v\$ "
\s stands for the name of the shell and -\v for its version. At
    the end of the prompt we are placing a $. Since this gets a bit
    boring, the following entry - which is default in most Linux
    distributions - may be used: 
~/.bashrc: PS1="\u@\h \w \$ "
 | 
    This stands for user@ current_directory $, which is the normal
    shell prompt most Linux users are familiar with.
     
Escape Sequences
    To add a personal touch by coloring the prompt we are using
    escape sequences. An escape sequence is a control instruction
    which orders the shell to execute a specific step. An escape
    sequence usually begins with ESC (thus the name).
In the shell chown as ^[. This way of writing needs a
    bit getting used to, \033 accomplishes the same (ESC is ascii 27 decimal = 33 octal). 
    
    To enter an escape sequence directly into the shell we have to
    precede it with crtl-v:  CTRL-v ESC.
     
Using the Colors of the Shell
    I am going to explain the colors of the shell with an example
    prompt.
~/.bashrc: PS1="\[\033[0;32;40m\u@\h:\w\$ \]"
    This displays the complete prompt in green. Like this: 
    
      
    
    
    \033 starts the escape sequence, with [ we are beginning the
    color definition. The following 0 specifies default font width.
    Other possibilities for this I am going to introduce later. The
    string will be enclosed in \[ and \] to prevent the text of the
    escape sequence from showing up in the display of the shell and
    taking too much space. 
    
    Next we are choosing the color of the foreground (in this case
    32, which is green). The background color 40 stands for black.
    To prevent the text after the prompt from being green, we are
    closing the escape sequence with \033[0m, which is the default
    color of the shell. For the foreground as well as the
    background 8 colors are available. 
    
    Choices: red, green, yellow, blue, magenta, cyan and white. The
    color codes for this are 30 (black), 31 (red), 32 (green), 33
    (yellow), 34 (blue), 35 ( magenta), 36 (cyan), 37 (white). 
    
     Setting the background colors follows the same scheme, but
    instead of the first digit '3' we are using '4', like 40, 41,
    42, 43, 44, 45, 46, 47. 
    
    Example:
~/.bashrc: PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"
    
    This gives us a very colorful prompt:
    
      
    
    
    To test these settings we are using export PS1="string",
    later we may transfer the setting into .bashrc. My current
    prompt looks like this:
PS1="\[\033[1;34;40m[\033[1;31;40m\u@\h:\w\033[1;34;40m]\033[1;37;40m $\033[0;37;0m\] "
    
    
      
    
     
Text Properties
    As previously mentioned, the '0' after the first escape
    sequence is the default color setting for the text of the shell
    prompt. For the text properties the following values make
    sense: 0, 1, 22, 4, 24, 5, 25, 7, 27 with the following
    meaning: default, bold, not bold, underlined, not underlined,
    blinking and not blinking, invers, not invers. 
    
    With the help of the following short script we can have a look
    at the color combinations.
#!/bin/sh
############################################################
# Nico Golde <nico(at)ngolde.de> Homepage: http://www.ngolde.de
# Last change: Mon Feb 16 16:24:41 CET 2004
############################################################
for attr in 0 1 4 5 7 ; do
    echo "----------------------------------------------------------------"
    printf "ESC[%s;Foreground;Background - \n" $attr
    for fore in 30 31 32 33 34 35 36 37; do
        for back in 40 41 42 43 44 45 46 47; do
            printf '\033[%s;%s;%sm %02s;%02s  ' $attr $fore $back $fore $back
        done
    printf '\n'
    done
    printf '\033[0m'
done
    The script can be downloaded as a tar.gz from: 
    showansicol.tar.gz
     
Another Application
    The ability to set colors in the shell is not only useful to
    create a more beautiful shell prompt but may also be beneficial
    for the programming of a program for the console. 
    
    For every use of colors the use of libraries such as
    slang or ncurses would be necessary, this would
    greatly inflate the size of the binary file. Ncurses has
    the advantage of being more or less independant from the type
    of terminal.
     
Examples in C
    A 'Hello World' in green text:
#include <stdio.h>
int main(void){
  const char *const green = "\033[0;40;32m";
  const char *const normal = "\033[0m";
  printf("%sHello World%s\n", green, normal);
  return 0;
}
    Another useful escape sequence is printf("\033[2J"), it
    has the same effect like system(clear) but the header
    file unistd.h can be left off. 
    
    With printf("\033[1K") we can delete a line.
     
Examples for init-Scripts
    If we would like to get a colorful, good legible confirmation
    of the successful start of the init scripts of
    /etc/init.d instead of simply '.' we may
    accomplish that again with an escape sequence. 
    
    This is an excerpt from a cron init script:
#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
 case "$1" in
 start)  echo -n "Starting periodic command scheduler: cron"
     start-stop-daemon --start --quiet --exec /usr/sbin/cron
                 echo "."
;;
    The successful start of cron will be shown with a
    period. The color feature of this could be handled by [Ok]
    through a change of the echo string, e.g.:
#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
case "$1" in
start)  echo -n "Starting periodic command scheduler: cron"
        start-stop-daemon --start --quiet --exec /usr/sbin/cron
echo "\[ \033[1;34;40m[ \033[1;32;40mOk \033[1;34;40m]\033[0m\]"
    ;;
    Applying these settings to all init scripts is very time
    consuming, except we are using the escape sequence \033 - since
    Ctrl-v which is not interpreted as a character.
     
Feedback
    Feedback, critique, bugs, etc. please mail to "nico at
    ngolde.de". Have fun...
  
 
Talkback form for this article
Every article has its own talkback page. On this page you can submit a comment or look at comments from other readers:
<--, back to the index of this issue 
2004-04-01, generated by lfparser version 2.46