## 4.10. Highlighting and Color in Shell Prompts

If your prompt has some information that you want to stand out -- or if you want your whole prompt to stand out from the rest of the text on the screen -- you might be able to make it in enhanced characters or colors. If your terminal has special escape sequences for enhancing the characters (and most do), you can use them to make part or all of your prompt stand out. Newer versions of xterm also have color capability, as does the Mac OS X Terminal program, though Terminal may not properly support the escape sequences we discuss later. (The GNU dircolors (Section 8.6) command sets up a color-capable terminal.)

Go to http://examples.oreilly.com/upt3 for more information on: blinkprompt.cshblinkprompt.sh

Let's say that you want to make sure people notice that they're logged in as root (the superuser) by making part of the root prompt flash. Here are lines for the root .cshrc:

>     # Put ESCape character in $e.  Use to start blinking mode (${e}[5m)
>     # and go back to normal mode (${e}[0m) on VT100-series terminals:
>     set e="`echo x | tr x '\033'`"

`uname -n` Section 2.5

>     set prompt="${e}[5mroot${e}[0m@`uname -n`# "

That prompt might look like this, with the word `root` flashing:

>     root@www.jpeek.com#

> NOTE: Shells with command-line editing need to calculate the width of your prompt string. When you put nonprinting escape sequences in a prompt (as we're doing here), in zsh and tcsh you have to delimit them with `%{` and `%}`. In bash , bracket nonprinting characters with `\[` and `\]`. In the Korn shell, prefix your prompt with a nonprinting character (such as CTRL-a) followed by a RETURN, and delimit the escape codes with this same nonprinting character. As the pdksh manual page says, "Don't blame me for this hack; it's in the original ksh."

The prompt is set inside double quotes (`"`), so the `uname' -n` command is run once, when the PS1 string is first stored. In some shells, like bash and pdksh, you can put single quotes (`'`) around the PS1 string; this stores the backquotes (```) in the string, and the shell will interpret them before it prints each prompt. (In this case, that's useless because the output of `uname -n` will always be the same in a particular invocation of a shell. But if you want constantly updated information in your prompt, it's very handy.) Section 4.6 and Section 27.12 have more info.

Because the same escape sequences won't work on all terminals, it's probably a good idea to add an if test that only sets the prompt if the terminal type $TERM is in the Digital Equipment Corporation VT100 series (or one that emulates it). Table 4-1 shows a few escape sequences for VT100 and compatible terminals. (The `ESC` in each sequence stands for an ESCape character. )

#### Table 4-1. VT100 escape sequences for highlighting

Sequence | What it does
--- | ---
ESC[1m | Bold, intensify foreground
ESC[4m | Underscore
ESC[5m | Blink
ESC[7m | Reverse video
ESC[0m | All attributes off

Of course, you can use different escape sequences if your terminal needs them. Better, read your terminal's terminfo or termcap database with a program like tput or tcap to get the correct escape sequences for your terminal. Store the escape sequences in shell variables (Section 35.9).

bash interprets octal character codes (like `\033`) in the prompt. It also has special-backslashed special-prompt characters -- for instance, bash Version 2 has `\e`, which outputs an ESCape character, and `\H`, which gives the complete hostname. The string `\$` is replaced by a dollar sign (`$`) on non-root shells and a hash mark (`#`) if you're currently root. So, on bash, you can make the previous csh prompt this way:

>     PS1='\[\e[5m\]root\[\e[0m\]@\H\$ '

(The delimiters for nonprinting characters, `\[` and `\]`, might make it look complicated. Try spotting them first, as you look at the prompt string, so you can see what's left.)

Eight-bit-clean versions of tcsh can put standout, boldface, and underline -- and any other terminal escape sequence, too -- into your shell prompt. For instance, `%S` starts standout mode and `%s` ends it; the tcsh manpage has details for your version. The next example shows how to make the same prompt as earlier with the word `root` in standout mode. (tcsh puts the hostname into `%m`.) Because tcsh "knows" the width of its special `%S` and `%s` formatting sequences, they don't need to be delimited with `%{` or `%}`:

>     set prompt = '%Sroot%s@%m# '

You also can add color to your prompt! For instance, make the previous prompt for bash using bright red (1;31) on a blue background (44):

>     PS1='\[\e[1;31;44m\]root\[\e[0m\]@\H# '

--JP and SJC

Copyright © 2003 O'Reilly & Associates. All rights reserved.