分享

Colours

 linf_11 2014-05-04

6.1. Colours

As mentioned before, non-printing escape sequences have to be enclosed in
\[\033[ and \].  For colour
escape sequences, they should also be followed by a lowercase
m.

If you try out the following prompts in an xterm and find that you aren't
seeing the colours named, check out your
~/.Xdefaults file (and
possibly its bretheren) for lines like
XTerm*Foreground: BlanchedAlmond.
This can be commented out by placing an exclamation mark ("!") in front of
it.  Of course, this will also be dependent on what terminal emulator
you're using.  This is the likeliest place that your term foreground
colours would be overridden.

To include blue text in the prompt:

PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "

The problem with this prompt is that the blue colour that starts with the
34 colour code is never switched back to the regular colour, so any text
you type after the prompt is still in the colour of the prompt.  This is
also a dark shade of blue, so combining it with the
bold code might help:

PS1="\[\033[1;34m\][\$(date +%H%M)][\u@\h:\w]$\[\033[0m\] "

The prompt is now in light blue, and it ends by switching the colour
back to nothing (whatever foreground colour you had previously).

Here are the rest of the colour equivalences:

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

Daniel Dui (ddui@iee.org) points out that to be strictly accurate, we must
mention that the list above is for colours at the console.  In an xterm,
the code 1;31 isn't "Light Red," but "Bold Red." 
This is true of all the colours.

You can also set background colours by using 44 for Blue background, 41 for
a Red background, etc.  There are no bold background colours.  Combinations
can be used, like Light Red text on a Blue background:
\[\033[44;1;31m\], although setting the colours
separately seems to work better (ie.
\[\033[44m\]\[\033[1;31m\]).  Other codes
available include 4: Underscore, 5: Blink, 7: Inverse, and 8: Concealed.

Note

Many people (myself included) object strongly to the
"blink" attribute because it's extremely distracting and irritating. 
Fortunately, it doesn't work in any terminal emulators
that I'm aware of - but it will still work on the console. 

Note

If you were wondering (as I did) "What use is a 'Concealed' attribute?!" -
I saw it used in an example shell script (not a prompt) to allow someone to
type in a password without it being echoed to the screen.  However, this
attribute doesn't seem to be honoured by many terms other than "Xterm."

Based on a prompt called "elite2" in the Bashprompt package (which I
have modified to work better on a standard console, rather than with the
special xterm fonts required to view the original properly), this is a
prompt I've used a lot:

 
function elite
{

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

case $TERM in
    xterm*|rxvt*)
        local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
        ;;
    *)
        local TITLEBAR=""
        ;;
esac

local temp=$(tty)
local GRAD1=${temp:5}
PS1="$TITLEBAR$GRAY-$CYAN-$LIGHT_CYAN($CYAN\u$GRAY@$CYAN\h$LIGHT_CYAN)$CYAN-$LIGHT_CYAN($CYAN\#$GRAY/$CYAN$GRAD1$LIGHT_CYAN)$CYAN-$LIGHT_CYAN($CYAN\$(date +%H%M)$GRAY/$CYAN\$(date +%d-%b-%y)$LIGHT_CYAN)$CYAN-$GRAY-$LIGHT_GRAY\n$GRAY-$CYAN-$LIGHT_CYAN($CYAN\$$GRAY:$CYAN\w$LIGHT_CYAN)$CYAN-$GRAY-$LIGHT_GRAY " 
PS2="$LIGHT_CYAN-$CYAN-$GRAY-$NO_COLOUR "
}

I define the colours as temporary shell variables in the name of
readability.  It's easier to work with.  The "GRAD1" variable is a check to
determine what terminal you're on.  Like the test to determine if you're
working in an Xterm, it only needs to be done once.  The prompt you see
look like this, except in colour:

--(giles@gcsu202014)-(30/pts/6)-(0816/01-Aug-01)--
--($:~/tmp)--

To help myself remember what colours are available, I wrote a script that
output all the colours to the screen.  Daniel Crisman has supplied a much
nicer version which I include below:

#!/bin/bash
#
#   This file echoes a bunch of color codes to the 
#   terminal to demonstrate what's available.  Each 
#   line is the color code of one forground color,
#   out of 17 (default + 16 escapes), followed by a 
#   test use of that color on all nine background 
#   colors (default + 8 escapes).
#

T='gYw'   # The test text

echo -e "\n                 40m     41m     42m     43m     44m     45m     46m     47m";

for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m'            '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m'            '  36m' '1;36m' '  37m' '1;37m';
  do FG=${FGs// /}
  echo -en " $FGs \033[$FG  $T  "
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
    do echo -en "$EINS \033[$FG\033[$BG  $T  \033[0m";
  done
  echo;
done
echo

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约