I would like to change the colors (background, font, foreground) of my xterm from the commandline. I've heard that this can be done using ANSI escape sequences.

If this is possible:

  • How is it done?
  • Can I use color names or must I use their RGB codes?
link|improve this question

53% accept rate
feedback

3 Answers

up vote 2 down vote accepted

ANSI escape sequences consist of a sequence of characters beginning with the Escape character, character 27. The next character is often (though not always) an open-square-bracket: [

The echo command can send escape characters if you specify -e and use \e for escape.

The ANSI standard defines 8 colours, plus a bright mode, giving a total of 16 posibilities. The sequence is:

\e[<number>m

Where <number> is one of:

Foreground:

  • 30 Black
  • 31 Red
  • 32 Green
  • 33 Yellow
  • 34 Blue
  • 35 Magenta
  • 36 Cyan
  • 37 White

Background:

  • 40 Black
  • 41 Red
  • 42 Green
  • 43 Yellow
  • 44 Blue
  • 45 Magenta
  • 46 Cyan
  • 47 White

  • 0 Reset all

  • 1 Bold

So to make your foreground red and your background yellow:

$ echo -e "\e[31m\e[43m"

And to enable bold:

$ echo -e "\e[1m"

Of course, you can combine them all together:

$ echo -e "\e[31m\e[43m\e[1m"

There are many many other escape codes for doing other things.

For example - clear the screen and move the cursor to the top-left:

$ echo -e "\e[2J\e[1;1H"

Which is useful when changing the colour:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

Which will change the colours, clear the screen, and put the cursor at the top-left. Well, almost the top left. Echo puts a carriage return in, so it moves down a line. You can add -n to echo to prevent this if you're fussy.

If you mess it all up and can't see what you're typing you can reset the terminal colours to normal by pressing:

Ctrl+v [ 0 m Return

At what you hope is the command prompt. It will whinge about an unknown command, but you will be able to see what you're doing again.

link|improve this answer
can I use color names instead of color codes? – Nathan Fellman Apr 13 '11 at 14:02
1  
No, but you can assign the colour codes to variables. FGRED=31; echo -e "\e[${FGRED}m" – Majenko Apr 13 '11 at 14:15
you rule,you are great man... Nice example:) – Parhs May 11 '11 at 14:36
feedback

Note that modern Xterms support 32-bit color!

Simple example. To set a nice dark purple background (hey, each to his own) of value #53186f, you do:

echo -ne "\033]11;#53186f\007"

Note that this instantly changes the color of the whole window, not just of the subsequent text. This is especially nice for making a window obviously different after ssh'ing to a server (for example). Put the above 'echo' into your .bashrc and your terminal automatically changes colors when you log into that server (but won't change back when you Ctrl-D out)

You can spend HOURS on the net looking for this - most docs only talk about the original 16 ANSI colors.

Sources: http://www.steike.com/code/xterm-colors/ and http://rtfm.etla.org/xterm/ctlseq.html (look under "Operating System Controls")

link|improve this answer
feedback

NOTE: The "^[" is the escape character, and is inserted with a CTRL-V,CTRL-[, and ^G is a bell character, inserted with CTRL-V,CTRL-G

The following block is in my .bash_profile and ensures that my xterms on this system are ALWAYS white-on-black, even after logging onto another system that may have changed my colors.

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '
link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.