If you've just begun programming on the Linux console, you may find yourself less than enthused about the available color choices (or lack thereof). Indeed, the default -- dreary gray on black -- brings to mind Henry Ford's famous statement regarding color schemes for his Model T: "You can have any color you want, as long as it's black."
You may have noticed that the "ls" command is capable of producing a rainbow of colors; executables are typically green, compressed files are red, and graphics (.GIF, .JPG, etc.) are purple.
But are these special hues limited to file listings? If not, how can you apply the day-glo treatment to your own code?
The answer is surprisingly simple: all you need are some console escape sequences.
Try typing the following at your command prompt:
echo -e "/033[35;1m Shocking /033[0m" |
This is made possible by /033 , the standard console "escape" code, which is equivalent to ^[ , or 0x1B in hex. When this character is received, the Linux console treats the subsequent characters as a series of commands. These commands can do any number of neat tricks, including changing text colors.
Here's the actual syntax:
/033 [ <command> m |
Anything following the trailing "m" is considered to be text. It doesn't matter if you leave a space behind the "m" or not.
So this is how you turn your text to a deep forest green:
echo -e "/033[32mRun, forest green, run." |
/033[0m |
echo -e "/033[32mThis is green." echo "And so is this." echo "And this." echo -e "/033[0mNow we're back to normal." |
Programming Console Colors
Of course, escape sequences aren't limited to shell scripts and functions. Let's see how the same result can be achieved with C and Perl:
C: printf("/033[34mThis is blue./033[0m/n"); Perl: print "/033[34mThis is blue./033[0m/n"; |
Available Colors
Now, how do you know which codes do what? The first eight basic EGA colors are defined as follows: 30 black foreground 31 red foreground 32 green foreground 33 brown foreground 34 blue foreground 35 magenta (purple) foreground 36 cyan (light blue) foreground 37 gray foreground |
echo -e "The /033[36mocean/033[0m is deep." |
Combining Commands
Multiple console codes can be issued simultaneously by using a semicolon (";"). One useful command is "1", which sets text to bold. The actual effect is a lighter shade of the chosen color. So, to get a light magenta (purple) as shown in the first example, you would do this:
echo -e "/033[35;1mCombining console codes/033[0m" |
Backgrounds
Text backgrounds can also be set with console codes, allowing you to have white on top of red (for example). Here is the full list of available background options: 40 black background 41 red background 42 green background 43 brown background 44 blue background 45 magenta background 46 cyan background 47 white background |
echo -e "/033[45;37mGrey on purple./033[0m" |
0 reset all attributes to their defaults 1 set bold 5 set blink 7 set reverse video 22 set normal intensity 25 blink off 27 reverse video off |
Conclusion
And now you have the answer to boring, plain ol' console text. A splash of color can liven up almost any display, creating better aesthetics as well as improving the overall feel.Unfortunately, these techniques are limited to the console, as they don't display over telnet (unless the remote interface is also a Linux console).
Note that the codes given here are known as ECMA-48 compliant. That is, they work on systems other than Linux. (In case you're interested, ECMA is the European Computer Manufacturers Association, a standards body similar to the ISO). Any system with a VT-102 capable console can use the color codes demonstrated above.
Related Resources
1. ECMA This is the page that covers Standard ECMA-48, "Control Functions for Coded Character Sets".2. "man console_codes" The console_codes man page contains substantial information on not only ECMA-48 compliant codes, but the Linux-specific ones as well.
3. The Linux Documentation Project The LDP is a vast storehouse of Linux-related knowledge.