$Id: MINI-colour,v 1.4 1994/12/05 19:10:26 ravn Exp $ Thorbjoern Ravn Andersen ravn@imada.ou.dk A standard installation of Linux with Slackware [*] enables colours with the 'ls' command. Sometimes you wish to use other colours than the default, but this is hard to do with a non-black background. This mini-howto explains which standard escape codes to use and where to use them. [* The information in here was compiled with the 2.0.2 release of Slackware, and the 1.1.54 kernel. It works both with agetty and mgetty_ps.] 1) How to select colours? Essentially you have two choices: Method 1: Use the setterm program which is fine if you just need a quick change. The helpscreen and man page are cryptic, so here you are somewhat on your own. [If somebody has an adequate description I would love to read it]. Selections are done like "setterm -foreground black -background white -store" where the "-store" makes it the default for the current console. This needs to be done for each virtual console you want to change, so a good place might be in your .login file. Now you know as much as I do about setterm. :-) Metod 2: Linux uses ANSI escape codes of the form ESC [ m where ESC is ASCII 27 and are zero or more numbers separated with semi-colons. Valid examples might be "\033[41;33;1m" which results in bright yellow on red, "\033[30;47m" which results in white on black, and "\033[m" which restores the default colour set. These examples requires that the shell in question recognizes the \xxx construction. If not, just insert an escape character directly in the string. In bash/vi type Ctrl-V ESC, and in tcsh/emacs type Ctrl-Q ESC. 2) What colour combinations are available? This c-shell script shows all colour combinations on the current console: ------------------- CUT HERE----------- #!/bin/csh # # Display ANSI colours. /ravn 941129 # set esc="\033[" foreach fore (30 31 32 33 34 35 36 37) set line1="$fore " line2=" " foreach back (40 41 42 43 44 45 46 47) set line1="${line1}${esc}${back};${fore}m Normal ${esc}0m" set line2="${line2}${esc}${back};${fore};1m ${back} Bold ${esc}0m" end echo "$line1\n$line2" end ------------------- CUT HERE----------- The foreground colour number is listed to the left, and the background number in the box. If you want bold you add a "1" to the parameters. Put semi colons in between, and plug it in the part above. Note: The background cannot be bold, so you cannot have yellow (bold brown) as a background. 3) How to make 'ls' select colours. The colourised 'ls' command looks for the configuration in "~/.dir_colors", and failing that in "/etc/DIR_COLORS". It contains a lot of entries like LINK 36;1 # symbolic link FIFO 40;33 # pipe SOCK 41;01;35 # socket BLK 41;33;01 # block device driver CHR 41;33;01 # character device driver # This is for files with execute permission: EXEC 32;1 which is exactly the part from the ANSI sequence. Alter these as you wish. See the result with '/sbin', '/etc', and '/dev'. 4) How to set a default colour set. This is set individually for each virtual console, with the ANSI sequence [**] ESC [ 8 ] which sets the default to the current fore- and background colours. Then the Reset Attributes string (ESC [ m) selects these colours instead of white on black. [** This information was found by browsing the kernel source. I don't know whether this is standard.] The method described below is primarily intended for stand-alone systems, in the sense that logins *only* happen on the console. There should not be any logins from terminals, modems or other machines, as they may not understand the sequences added. On a *stand-alone* Linux system a good file is "/etc/issue", so edit this file directly and check the result by typing Ctrl-D to a login prompt. If you have a standard Slackware installation this file is rewritten each time the system is rebooted, so if your "/etc/rc.d/rc.S" contains lines looking like (around line 75) # Setup the /etc/issue and /etc/motd to reflect the current kernel level: # THESE WIPE ANY CHANGES YOU MAKE TO /ETC/ISSUE AND /ETC/MOTD WITH EACH # BOOT. COMMENT THEM OUT IF YOU WANT TO MAKE CUSTOM VERSIONS. echo ""> /etc/issue echo Welcome to Linux `/bin/uname -a | /bin/cut -d\ -f3`. >> /etc/issue echo >> /etc/issue you may want to either comment these out or replace the first echo line with ... # BOOT. COMMENT THEM OUT IF YOU WANT TO MAKE CUSTOM VERSIONS. ESCAPE="" echo "${ESCAPE}[H${ESCAPE}[37;44m${ESCAPE}[8]${ESCAPE}[2J"> /etc/issue ... My startup-shell doesn't understand the "\033" so I must insert the ASCII code 27 literally in my script where indicated (as described in section 1). The line should then look like 'ESCAPE="^[" '. This code will home the cursor, set the colour (here white on blue), save this selection and clean the rest of the screen. This modification takes effect after the next reboot. If your Linux box *is not* stand-alone, you may have problems with remote users since their terminal probably cannot understand the sequences inserted above. Then you must make this user-based by adding it to your .profile (sh/bash) if [ "$TERM" = "console" ]; then echo "\033[37;44m\033[8]" fi .login (csh/tcsh) if ( "$TERM" == "console" ) then echo "\033[37;44m\033[8]" endif or system wide by modifying "/etc/profile" or "/etc/csh.login" as root. (Again, replace \033 with literate escapes if the shell cannot parse \xxx constructions) 6) Comments and criticism This is still a rough draft, and English isn't my primary language. Please feel free to correct me on the above text in order to make it as clear and correct as possible. This goes, of course, for the information provided as well. Comments and criticism goes to -- Thorbjo/rn Ravn Andersen "...and...Tubular Bells!" ravn@imada.ou.dk