Terminal codes (ANSI/VT100)

game ascii icon

Bron: bash-hackers.org

Terminal (control-)codes are needed to give specific commands to your terminal. This can be related to switching colors or positioning the cursor, simply everything that can’t be done by the application itself.

How it technically works

A terminal control code is a special sequence of characters that is printed (like any other text). If the terminal understands the code, it won’t display the character-sequence, but will perform some action. You can always print the codes with a simple echo command – for the application, it’s nothing special.

Note: I see that codes referenced as “Bash colors” sometimes (several “Bash tutorials” etc…): That’s a retarded and completely incorrect definition.

The tput command

Because there’s a large number of different terminal control languages, usually a system has an intermediate-layer to talk to it. The real codes are looked up in a database for the currently detected terminal type and you give standardized requests to an API or (from the shell) to a command.

One of these commands is tput—it accepts a set of acronyms called capability names and any parameters, if appropriate, then looks up the correct escape sequences for the detected terminal in the terminfo database and prints the correct codes (the terminal hopefully understands).

The codes

In this list I’ll focus to ANSI/VT100 control codes for the most needed actions – take it as quick reference. The documentation of your terminal or the terminfo database is always the preferred source when something is unclear! Also the tput acronyms are the ones dedicated for ANSI escapes, usually!

Also I only listed the most relevant codes, of course, any ANSI or especially your nice terminal knows much more! But let’s reduce to common shell scripting ;-)

Sometimes I didn’t find a matching ANSI escape or vice versa – you’ll see a :?: as code then – feel free to mail me or fix it!

The ANSI codes are always intoduced with an ESC character (ASCII 0x1B or octal 033) – this isn’t part of the list, but you should avoid to use the ANSI codes directly – use the tput command!

All codes that can be used with tput can be found in terminfo(5). (on OpenBSD at least) See OpenBSD’s terminfo(5) under the Capabilities section. The cap-name is the code to use with tput, a description of each code is also provided.

General useful ASCII codes

The Ctrl-Key representation is simply associating the non-printable characters from ASCII code 1 with the printable (letter) characters from ASCII code 65 (“A”). ASCII code 1 would be ^A (Ctrl-A), while ASCII code 7 (BEL) would be ^G (Ctrl-G). This is a common representation (and input method) and historically comes from one of the VT series of terminals.

Name decimal octal hex C-escape Ctrl-Key Description
BEL 7 007 0x07 \a ^G Terminal bell
BS 8 010 0x08 \b ^H Backspace
HT 9 011 0x09 \t ^I Horizontal TAB
LF 10 012 0x0A \n ^J Linefeed (newline)
VT 11 013 0x0B \v ^K Vertical TAB
FF 12 014 0x0C \f ^L Formfeed (also: New page NP)
CR 13 015 0x0D \r ^M Carriage return
ESC 27 033 0x1B <none> ^[ Escape character
DEL 127 177 0x7F <none> <none> Delete character

Cursor handling

ANSI terminfo equivalent Description
[ <X> ; <Y> H
[ <X> ; <Y> f
cup <X> <Y> Home-positioning to X and Y coordinates
:!: it seems that ANSI takes 1-1 as root while tput takes 0-0
[ H home Home-positioning to root (0-0)
7 sc Save current cursor position
8 rc Restore current cursor position
:?: most likely a normal code like \b cub1 move left one space (backspace)
VT100 [ ? 25 l civis switch cursor invisible
VT100 [ ? 25 h cvvis switch cursor visible

Erasing text

ANSI terminfo equivalent Description
[ K
[ 0 K
el Clear line from current cursor position to end of line
[ 1 K el1 Clear line from beginning to current cursor position
[ 2 K el2:?: Clear whole line (cursor position unchanged)

General text attributes

ANSI terminfo equivalent Description
[ 0 m sgr0 Reset all attributes
[ 1 m bold Set “bright” attribute
[ 2 m dim Set “dim” attribute
[ 4 m set smul unset rmul :?: Set “underscore” (underlined text) attribute
[ 5 m blink Set “blink” attribute
[ 7 m rev Set “reverse” attribute
[ 8 m invis Set “hidden” attribute

Foreground coloring

ANSI terminfo equivalent Description
[ 3 0 m setaf 0 Set foreground to color #0 – black
[ 3 1 m setaf 1 Set foreground to color #1 – red
[ 3 2 m setaf 2 Set foreground to color #2 – green
[ 3 3 m setaf 3 Set foreground to color #3 – yellow
[ 3 4 m setaf 4 Set foreground to color #4 – blue
[ 3 5 m setaf 5 Set foreground to color #5 – magenta
[ 3 6 m setaf 6 Set foreground to color #6 – cyan
[ 3 7 m setaf 7 Set foreground to color #7 – white
[ 3 9 m setaf 9 Set default color as foreground color

Background coloring

ANSI terminfo equivalent Description
[ 4 0 m setab 0 Set background to color #0 – black
[ 4 1 m setab 1 Set background to color #1 – red
[ 4 2 m setab 2 Set background to color #2 – green
[ 4 3 m setab 3 Set background to color #3 – yellow
[ 4 4 m setab 4 Set background to color #4 – blue
[ 4 5 m setab 5 Set background to color #5 – magenta
[ 4 6 m setab 6 Set background to color #6 – cyan
[ 4 7 m setab 7 Set background to color #7 – white
[ 4 9 m setaf 9 Set default color as background color

Misc codes

Save/restore screen

Used capabilities: smcup, rmcup

You’ve undoubtedly already encountered programs that restore the terminal contents after they do their work (like vim). This can be done by the following commands:

These features require that certain capabilities exist in your termcap/terminfo. While xterm and most of its clones (rxvt, urxvt, etc) will support the instructions, your operating system may not include references to them in its default xterm profile. (FreeBSD, in particular, falls into this category.) If tput smcup appears to do nothing for you, and you don’t want to modify your system termcap/terminfo data, and you KNOW that you are using a compatible xterm application, the following may be work for you:

Certain software applications utilize these codes (via their termcap capabilities) as well; you may have seen the screen save/restore in less, vim, top, screen and others. Some of these applications may also provide configuration options to *disable* this behaviour. For example, less has a -X option for this, which can also be set in an environment variable:

Similarly, vim can be configured not to “restore” the screen by adding the following to your ~/.vimrc:

Additional colors

Some terminal emulators support many additional colors. The most common extension used by xterm-compatible terminals supports 256 colors. These can be generated by tput with seta{f,b} [0-255] when the TERM value has a -256color suffix. Konsole supports full 24-bit colors, and as of KDE 4.9 any X11 color code can be written directly into a special escape sequence. Other terminals may offer similar extensions. Few, if any programs are able to make use of anything beyond 256, and tput doesn’t know about them. Colors beyond 16 usually only apply to modern terminal emulators running in graphical environments.

The VT implemented in the Linux kernel supports only 16 colors, and the usual default terminfo entry for TERM=linux defines only 8. There is sometimes an alternate “linux-16color” that you can switch to to get the other 8 colors.

Bash examples

Hardcoded colors

Colors using tput

Directly inside the echo:

With preset variables:


HOME function

Silly but nice effect

Mandelbrot set

This is a slightly modified version of Charles Cooke’s colorful Mandelbrot plot scripts ( original w/ screenshot) – ungolfed, optimized a bit, and without hard-coded terminal escapes. The colorBox function is memoized to collect tput output only when required and output a new escape only when a color change is needed. This limits the number of tput calls to at most 16, and reduces raw output by more than half. The doBash function uses integer arithmetic, but is still ksh93-compatible (run as e.g. bash ./mandelbrotto use it). The ksh93-only floating-point doKsh is almost 10x faster than doBash (thus the ksh shebang by default), but uses only features that don’t make the Bash parser puke.