Color output in console

This article or section needs expansion.
Reason:
And maybe create something bigger. Please take active approach if you can add some valuable information. (Discuss in
Talk:Color output in console
)
This article or section needs language, wiki syntax or style improvements. See
Help:Style
for reference.
Reason:
Page is partly a collection of information on different applications, partly begin to lay theory to color output process. Please contribute your knowledge, if you can. (Discuss in
Talk:Color output in console
)
Related articles
Emacs#Custom colors and theme
nano#Syntax highlighting
This page was created to consolidate colorization of CLI outputs.
Background
This article or section needs expansion.
Reason:
Probably a good idea to move the list-color scripts here now. (Discuss in
Talk:Color output in console
)
Escape sequences
The
ANSI escape sequences
define a way to put additional information into terminal output, and color is part of this "additional information". Throughout the years the range of terminal colors has been vastly expanded, from the initial eight colors to a full 24-bit truecolor.
The basic color encoding provides 8 normal-brightness colors and 8 brighter versions of these colors. Modern terminal emulators, including the Linux console itself, allows you to specify the precise RGB values that the colors translate to.  This mode is supported by almost all terminal emulators.
With the advent of 256-color displays came the 256-color escape. The 256 colors are the 16 basic colors, the 216 RGB colors (laid out in a 6x6x6 cube), and 24 levels of greyscale. Except for the first 16 colors, the scheme is usually not customizable as it has a well-defined mapping to RGB. This mode is supported by most terminal emulators. (A minority of emulators use a similar but incompatible encoding with only 88 colors. You are very unlikely to use them in practice, but they will appear in the terminfo database.)
Less commonly supported is the truecolor mode, allowing one to use 16.7 million (2
24
) colors in RGB (each value ranging from 0 to 255).
Termcap and terminfo
Termcap and terminfo, part of
ncurses
, are databases that provide information on the escape sequences terminals (usually specified by the
TERM
env-var) understand. The
tput(1)
and
infocmp(1)
commands can be used to access them from command-line.
Applications
diff
diffutils from version 3.4 includes the
--color
option (
GNU mailing list
).
$ alias diff='diff --color=auto'
grep
The
--color=auto
option enables color highlighting. Color codes are emitted only on standard output; not in pipes or redirection.
Color output in
grep
is also useful with
regexp
tasks.
Use an
alias
to permanently enable this option:
alias grep='grep --color=auto'
The
GREP_COLORS
variable is used to define colors, and it configures various parts of highlighting. To change the colors, find the needed
ANSI escape sequence
and apply it. See
grep(1) § GREP COLORS
for more information.
The
-n
option includes file line numbers in the output.
less
Environment variables
We can tell
less
to emit colors when it is meaning to make bold text and other formatting effects using the
--RAW-CONTROL-CHARS
and
--color
/
-D
arguments. We can also add
--use-color
to enable coloring of the
less
UI.
As an example, setting the
LESS
environment variable
to
--RAW-CONTROL-CHARS --use-color -Dd+r -Du+b
will set red for bold and blue for underlined.
For more info, see
less(1) § D
or
[1]
.
Reading from stdin
Note
It is recommended to add colored output through
#Environment variables
, as the below assumes that
LESS
is set to include
-R
When you run a command and pipe its
standard output
(
stdout
) to
less
for a paged view (e.g.
pacman -Qe | less
), you may find that the output is no longer colored. This is usually because the program tries to detect if its
stdout
is an interactive terminal, in which case it prints colored text, and otherwise prints uncolored text. This is good behaviour when you want to redirect
stdout
to a file, e.g.
pacman -Qe > pkglst-backup.txt
, but less suited when you want to view output in
less
.
Some programs provide an option to disable the interactive tty detection:
# dmesg --color=always | less
In case that the program does not provide any similar option, it is possible to trick the program into thinking its
stdout
is an interactive terminal with the following utilities:
ColorThis
— Force colored output of a program by running it within a (group of) pty, support forwarding stdin.
https://github.com/Sasasu/ColorThis
||
colorthis-git
AUR
stdoutisatty
— A small program and a
LD_PRELOAD
-able library that catches the
isatty(3)
function call.
https://github.com/lilydjwg/stdoutisatty
. ||
stdoutisatty
Example:
stdoutisatty
program
| less
unbuffer
— A tclsh script comes with expect, it invokes desired program within a pty.
unbuffer(1)
||
expect
Example:
unbuffer
program
| less
Alternatively, using
zpty
module from
zsh
:
[2]
~/.zshrc
zmodload zsh/zpty

pty() {
	zpty pty-${UID} ${1+$@}
	if [[ ! -t 1 ]];then
		setopt local_traps
		trap '' INT
	fi
	zpty -r pty-${UID}
	zpty -d pty-${UID}
}

ptyless() {
	pty $@ | less
}
Usage:
$ ptyless
program
To pipe it to other pager (less in this example):
$ pty
program
| less
ls
The
--color=auto
option enables color highlighting. Color codes are emitted only on standard output; not in pipes or redirection.
Use an
alias
to permanently enable this option:
alias ls='ls --color=auto'
The
LS_COLORS
variable is used to define colors, and it configures various parts of highlighting. Use the
dircolors(1)
command to set it.
An advanced alternative to
dircolors
that ships with many themes is the
vivid
package, see
vivid --help
for usage.
Note
Using the
--color
option may incur a noticeable performance penalty when
ls
is run in a directory with very many entries. The default settings require
ls
to
stat(1)
every single file it lists. However, if you would like most of the file-type coloring but can live without the other coloring options (e.g. executable, orphan, sticky, other-writable, capability), use
dircolors
to set the
LS_COLORS
environment variable like this:
eval $(dircolors -p | perl -pe 's/^((CAP|S[ET]|O[TR]|M|E)\w+).*/$1 00/' | dircolors -)
See
ls(1)
for more information.
man
There is a real color facility in
grotty(1)
(which is the default postprocessor used by
man
), but it is strongly discouraged for man pages. Most of the below options instead fake a colored manpage by replacing the sequences for bold, standout, and underline with spiced ones that contain color.
Using less
First, either:
Enable coloring in
less
everywhere, as in
#less
.
Enable coloring in
less
just with man, by setting the
MANPAGER
environment variable
to (for example)
less --use-color -Dd+r -Du+b
. The
--RAW-CONTROL-CHARS
option is not required, due to the below option.
You then need to disable SGR/OSC escape sequences in the
grotty(1)
postprocessor, as they don't work with
less
.
[3]
This is passed through the
-P
option of
nroff(1)
, which you can apply by setting the
MANROFFOPT
environment variable to
-P -c
Using most
The basic function of 'most' is similar to
less
and
more
, but it has a smaller feature set. Configuring most to use colors is easier than using less, but additional configuration is necessary to make most behave like less.
Install the
most
package.
Edit
/etc/man_db.conf
, uncomment the pager definition and change it to:
DEFINE     pager     most -s
Test the new setup by typing:
$ man whatever_man_page
Modifying the color values requires editing
~/.mostrc
(creating the file if it is not present) or editing
/etc/most.conf
for system-wide changes. Example
~/.mostrc
:
% Color settings
color normal lightgray black
color status yellow blue
color underline yellow black
color overstrike brightblue black
Using bat
bat
can be used as a colorizing pager for man, by setting the
MANPAGER
environment variable
as documented here
.
Using X resources
A quick way to add color to manual pages viewed on
xterm
/
uxterm
or
rxvt-unicode
is to modify
~/.Xresources
.
xterm
*VT100.colorBDMode:     true
*VT100.colorBD:         red
*VT100.colorULMode:     true
*VT100.colorUL:         cyan
which
replaces
the decorations with the colors.  Also add:
*VT100.veryBoldColors: 6
if you want colors and decorations (bold or underline)
at the same time
.  See
xterm(1) § veryBoldColors
for more information.
rxvt-unicode
URxvt.colorIT:      #87af5f
URxvt.colorBD:      #d7d7d7
URxvt.colorUL:      #87afd7
Run:
$ xrdb -load ~/.Xresources
Launch a new
xterm/uxterm
or
rxvt-unicode
and you should see colorful man pages.
This combination puts colors to
bold
and
underlined
words in
xterm/uxterm
or to
bold
,
underlined
, and
italicized
text in
rxvt-unicode
. You can play with different combinations of these attributes. See the
sources
(archived) of this item.
pacman
Pacman
has a color option. Uncomment the
Color
line in
/etc/pacman.conf
.
Wrappers
This article or section is a candidate for moving to [[]].
Notes:
Some of these could be made into sections of their own, or moved to existing sections such as
#diff
(Discuss in
Talk:Color output in console
)
Universal wrappers
(most of them outdated, but still functioning)
They go with multiple preconfigured presets that can be changed, and new ones can be created/contributed.
Warning
Wrappers replace output of commands with escape sequences. Some shell scripts and programs which use the output of standard shell utilities may not work correctly.
rainbow
— Colorize commands output or STDIN using patterns.
Presets: df, diff, env, host, ifconfig, java-stack-trace, jboss, jonas, md5sum, mvn2, mvn3, ping, tomcat, top, traceroute.
https://github.com/nicoulaj/rainbow
||
rainbow
AUR
grc
— Yet another colouriser for beautifying your logfiles or output of commands.
Presets: cat, cvs, df, diff, dig, gcc, g++, ls, ifconfig, make, mount, mtr, netstat, ping, ps, tail, traceroute, wdiff, blkid, du, dnf, docker, docker-machine, env, id, ip, iostat, last, lsattr, lsblk, lspci, lsmod, lsof, getfacl, getsebool, ulimit, uptime, nmap, fdisk, findmnt, free, semanage, sar, ss, sysctl, systemctl, stat, showmount, tune2fs and tcpdump.
https://github.com/garabik/grc
||
grc
cope
— A colourful wrapper for terminal programs.
Presets: acpi, arp, cc, df, dprofpp, fdisk, free, g++, gcc, id, ifconfig, ls, lspci, lsusb, make, md5sum, mpc, netstat, nm, nmap, nocope, ping, pmap, ps, readelf, route, screen, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shasum, socklist, stat, strace, tcpdump, tracepath, traceroute, w, wget, who, xrandr.
https://github.com/yogan/cope
||
cope-git
AUR
cw
— A non-intrusive real-time ANSI color wrapper for common unix-based commands. Wraps
file
which can cause issues.
Presets: arp, arping, auth.log@, blockdev, cal, cksum, clock, configure, cpuinfo@, crontab@, cw-pipe, cw-test.cgi, date, df, diff, dig, dmesg, du, env, figlet, file, find, finger, free, fstab@, fuser, g++, gcc, group@, groups, hdparm, hexdump, host, hosts@, id, ifconfig, inittab@, iptables, last, lastlog, lsattr, lsmod, lsof, ltrace-color, make, md5sum, meminfo@, messages@, mount, mpg123, netstat, nfsstat, nmap, nslookup, objdump, passwd@, ping, pmap, pmap_dump, praliases, profile@, protocols@, ps, pstree, quota, quotastats, resolv.conf@, route, routel, sdiff, services@, showmount, smbstatus, stat, strace-color, sysctl, syslog, tar, tcpdump, tracepath, traceroute, umount, uname, uptime, users, vmstat, w, wc, whereis, who, xferlog.
https://cwrapper.sourceforge.net/
||
cw
AUR
ccze
— A fast log colorizer written in C, intended to be a drop-in replacement for colorize
https://github.com/cornet/ccze/
||
ccze
AUR
Libraries for colorizing an output
libtextstyle
— A C library for styling text output to terminals
https://www.gnu.org/software/gettext/libtextstyle/manual/index.html
||
gettext
ruby-rainbow
— Rainbow is extension to ruby's String class adding support for colorizing text on ANSI terminal
https://rubygems.org/gems/rainbow/
||
ruby-rainbow
python-blessings
— A thin, practical wrapper around terminal coloring, styling, and positioning
https://github.com/erikrose/blessings
||
python-blessings
AUR
lolcat
— Ruby program that makes the output colorful like a rainbow
https://github.com/busyloop/lolcat/
||
lolcat
Application specific
Compilers
colorgcc
— A Perl wrapper to colorize the output of compilers with warning/error messages matching the gcc output format
https://github.com/colorgcc/colorgcc
||
colorgcc
diff
Diff has
built-in color output
, which is reasonable to use. But the following wrappers can be used:
colordiff
— Perl script for
diff
highlighting.
https://www.colordiff.org/
||
colordiff
cwdiff
—
(w)diff
wrapper with directories support and highlighting.
https://github.com/junghans/cwdiff
||
cwdiff
AUR
git-delta
— A syntax-highlighting pager for git and diff output.
https://github.com/dandavison/delta
||
git-delta
cat
bat
— Cat clone with syntax highlighting and git integration.
https://github.com/sharkdp/bat
||
bat
less
source-highlight
You can enable code syntax coloring in
less
. First,
install
source-highlight
, then add these lines to your shell configuration file:
~/.bashrc
export LESSOPEN="| /usr/bin/source-highlight-esc.sh %s"
export LESS='-R '
lesspipe
Frequent users of the command line interface might want to install
lesspipe
.
Users may now list the compressed files inside of an archive using their pager:
$ less
compressed_file
.tar.gz
==> use tar_file:contained_file to view a file in the archive
-rw-------
username
/
group
695 2008-01-04 19:24
compressed_file
/
content1
-rw-------
username
/
group
43 2007-11-07 11:17
compressed_file
/
content2
compressed_file
.tar.gz (END)
lesspipe
also grants
less
the ability of interfacing with files other than archives, serving as an alternative for the specific command associated for that file-type (such as viewing HTML via
python-html2text
).
Re-login after installing
lesspipe
in order to activate it, or source
/etc/profile.d/lesspipe.sh
.
Make
colormake
— A simple wrapper around make to make its output more readable.
https://github.com/pagekite/Colormake/
||
colormake
AUR
Ping
prettyping
— Add some great features to ping monitoring. A wrapper around the standard ping tool with the objective of making the output prettier, more colorful, more compact, and easier to read.
https://denilson.sa.nom.br/prettyping/
||
prettyping
Shells
bash
See
Bash/Prompt customization#Colors
.
Fish
See
Fish#Web interface
.
xonsh
See
Customizing the Prompt
.
zsh
See
Zsh#Colors
.
Terminal emulators
Virtual console
This article or section needs language, wiki syntax or style improvements. See
Help:Style
for reference.
Reason:
Lacks clarity on what "the colors" are, i.e. in
#Virtual console
they are about the
representations
of the 16 base colors (RGB values for yellow, red, blue, etc.), while in
#Login screen
they are about the base colors themselves. See also
console_codes(4)
and
User:Isacdaavid/Linux_Console
(Discuss in
Talk:Color output in console
)
The colors in the
Linux virtual console
running on the framebuffer can be changed. This is done by writing the escape code
\\e]PXRRGGBB
, where
X
is the hexadecimal index of the color from 0-F, and
RRGGBB
is a traditional hexadecimal RGB code.
For example, to reuse existing colors defined in
~/.Xresources
, add the following to the shell initialization file (such as
~/.bashrc
):
if [ "$TERM" = "linux" ]; then
    _SEDCMD='s/.*\*color\([0-9]\{1,\}\).*#\([0-9a-fA-F]\{6\}\).*/\1 \2/p'
    for i in $(sed -n "$_SEDCMD" $HOME/.Xresources | awk '$1 < 16 {printf "\\e]P%X%s", $1, $2}'); do
        echo -en "$i"
    done
    clear
fi
Login screen
The below is a colored example of the virtual console login screen in
/etc/issue
. Create a backup of the original file with
mv /etc/issue /etc/issue.bak
as root, and create a new
/etc/issue
:
\e[H\e[2J
                                                             \e[1;30m| \e[34m\r \s
      \e[36;1m/\\\\                        \e[37m||      \e[36m| =                 \e[30m|
     \e[36m/  \\\\                       \e[37m||      \e[36m|                   \e[30m| \e[32m\t
    \e[1;36m/ \e[0;36m.. \e[1m\\\\   \e[37m//==\\\\\\ ||/= /==\\\\ ||/=\\\\  \e[36m| | |/\\\\ |  | \\\\ /  \e[30m| \e[32m\d
   \e[0;36m/ .  . \\\\ \e[37m||    || ||  ||     ||  ||  \e[36m| | |  | |  |   X   \e[1;30m|
  \e[0;36m/  .  .  \\\\ \e[37m\\\\\\==/| ||   \\\\==/ ||  ||  \e[36m| | |  |\  \\/|  / \\\\ \e[1;30m| \e[31m\U
 \e[0;36m/ ..    .. \\\\   \e[0;37mA simple, lightweight linux distribution.   \e[1;30m|
\e[0;36m/_'        `_\\\\                                              \e[1;30m| \e[35m\l \e[0mon \e[1;33m\n
\e[0m
See also:
https://bbs.archlinux.org/viewtopic.php?pid=386429#p386429
https://www.linuxfromscratch.org/blfs/view/svn/postlfs/logon.html
X window system
Most
Xorg
terminals, including
xterm
and
urxvt
, support at least 16 basic colors. The colors 0-7 are the 'normal' colors. Colors 8-15 are their 'bright' counterparts, used for highlighting. These colors can be modified through
X resources
, or through specific terminal settings. For example:
~/.Xresources
! Black + DarkGrey
*color0:  #000000
*color8:  #555753
! DarkRed + Red
*color1:  #ff6565
*color9:  #ff8d8d
! DarkGreen + Green
*color2:  #93d44f
*color10: #c8e7a8
! DarkYellow + Yellow
*color3:  #eab93d
*color11: #ffc123
! DarkBlue + Blue
*color4:  #204a87
*color12: #3465a4
! DarkMagenta + Magenta
*color5:  #ce5c00
*color13: #f57900
!DarkCyan + Cyan (both not tango)
*color6:  #89b6e2
*color14: #46a4ff
! LightGrey + White
*color7:  #cccccc
*color15: #ffffff
Warning
Color resources such as
foreground
and
background
can be read by other applications (such as
emacs
). This can be avoided by specifiying the class name, for example
XTerm.foreground
.
See also:
#Using X resources
for how to color bold and underlined text automatically.
Color Themes
- Extensive list of terminal color themes by Phraktured.
Xcolors by dkeg
(see files with paths matching
theme/dkeg -
theme
in the repository)
base16 color schemes
Setting foreground and background colors with tput
Example to set bold, yellow text, with blue background:
$ tput bold; tput setaf 3; tput setab 4
tput command line option cheatsheet
tput command
Description
tput bold
Bold text
tput setaf [CODE]
Set foreground color
tput setab [CODE]
Set background color
tput rev
Inverse colors
tput sgr0
Reset everything
tput color codes
tput color [CODE]
Color
0
Black
1
Red
2
Green
3
Yellow
4
Blue
5
Magenta
6
Cyan
7
White
Example to print 256 colors across the screen:
$ (x=`tput op` y=`printf %76s`;for i in {0..256};do o=00$i;echo -e ${o:${#o}-3:3} `tput setaf $i;tput setab $i`${y// /=}$x;done)
Display tput escape codes
This article or section is a candidate for merging with
Bash/Prompt_customization
.
Notes:
More context on
tput
is provided in that article (Discuss in
Talk:Color output in console
)
Replace
tput op
with whatever tput you want to trace.
op
is the default foreground and background color.
$ ( strace -s5000 -e write tput op 2>&2 2>&1 ) | tee -a /dev/stderr | grep -o '"[^"]*"'
033[\033[1;34m"\33[39;49m"\033[00m
Enumerate supported colors
The following command will let you discover all the terminals you have terminfo support for, and the number of colors each terminal supports. The possible values are: 8, 15, 16, 52, 64, 88 and 256.
$ for T in `find /usr/share/terminfo -type f -printf '%f '`;do echo "$T `tput -T $T colors`";done|sort -nk2
Eterm-88color 88
rxvt-88color 88
xterm+88color 88
xterm-88color 88
Eterm-256color 256
gnome-256color 256
konsole-256color 256
putty-256color 256
rxvt-256color 256
screen-256color 256
screen-256color-bce 256
screen-256color-bce-s 256
screen-256color-s 256
xterm+256color 256
xterm-256color 256
Color scheme scripts
See
[4]
for scripts which display a chart of your current terminal scheme.
True color support
Some terminals support the full range of 16 million colors (RGB, each with 8 bit resolution): xterm, konsole, st, etc. The corresponding TERM values
xterm-direct
,
konsole-direct
,
st-direct
, etc. are supported starting with ncurses version 6.1
[5]
. For more info about terminal emulators and applications that support true color, see
[6]
.
Note that the Linux kernel supports the SGR (Select Graphic Rendition) escape sequences for true-color, but it is pointless to use it, because the driver maps the 24-bit color specifications to a 256-colors color map in the kernel (see the functions
rgb_foreground
,
rgb_background
). For this reason, there is no terminfo entry
linux-direct
.
See also
lolcat clone in x64 assembly