跳转至内容

终端中的彩色输出

来自 ArchWiki

本文章或章节需要扩充。

原因: 也许可以创建一个更大的版本。如果您能添加一些有价值的信息,请积极参与。(在 Talk:Color output in console 中讨论)

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 此页面部分是关于不同应用程序的信息集合,部分开始介绍彩色输出过程的理论。如果您能,请贡献您的知识。(在 Talk:Color output in console 中讨论)

创建此页面的目的是整合 CLI 输出的彩色化。

背景

本文章或章节需要扩充。

原因: 现在将 list-color 脚本移到这里可能是个好主意。(在 Talk:Color output in console 中讨论)

转义序列

ANSI 转义序列》定义了一种将附加信息放入终端输出的方式,颜色是这种“附加信息”的一部分。多年来,终端颜色的范围已大大扩展,从最初的八种颜色到全 24 位真彩色。

基本的颜色编码提供了 8 种常规亮度的颜色和这 8 种颜色的 8 种更亮的版本。现代终端模拟器,包括 Linux 控制台本身,允许您指定颜色对应的精确 RGB 值。几乎所有终端模拟器都支持此模式。

随着 256 色显示器的出现,出现了 256 色转义。256 色包括 16 种基本颜色、216 种 RGB 颜色(按 6x6x6 立方体排列)和 24 级灰度。除了前 16 种颜色外,该方案通常是不可定制的,因为它具有明确的 RGB 映射。大多数终端模拟器都支持此模式。(少数模拟器使用类似但不兼容的编码,只有 88 种颜色。您实际上不太可能使用它们,但它们会出现在 terminfo 数据库中。)

支持较少的是真彩色模式,允许使用 1670 万(224)种 RGB 颜色(每个值从 0 到 255)。

Termcap 和 terminfo

Termcap 和 terminfo 是 ncurses 的一部分,它们是提供终端(通常由 TERM 环境变量指定)理解的转义序列信息的数据库。可以使用 tput(1)infocmp(1) 命令从命令行访问它们。

应用程序

diff

diffutils 从 3.4 版本开始包含 --color 选项(GNU 邮件列表)。

$ alias diff='diff --color=auto'

grep

--color=auto 选项启用颜色高亮。颜色代码仅在标准输出中发出;不进入管道或重定向。

grep 中使用彩色输出对 正则表达式任务也很有用。

使用 别名永久启用此选项

alias grep='grep --color=auto'

GREP_COLORS 变量用于定义颜色,它配置高亮的各个部分。要更改颜色,请查找所需的 ANSI 转义序列并应用它。有关更多信息,请参阅 grep(1) § GREP COLORS

-n 选项包含输出中的文件行号。

ip

本文或本节正考虑移除。

原因: 默认启用彩色输出已在 6.18.0-1 中合并(已合并)。(在 Talk:Color output in console 中讨论)

来自 iproute2ip(8) 命令支持 -c/-color 选项的彩色输出。使用 auto 参数时,仅当 stdout 是终端时才会启用彩色输出。 iproute2 可以构建为以 auto 为默认值,但 这样的更改已被 Arch 包维护者拒绝。

您可以使用 别名来启用彩色输出,例如:

alias ip='ip -color=auto'

less

环境变量

我们可以通过 --RAW-CONTROL-CHARS--color/-D 参数来告诉 less 在需要加粗文本和其他格式化效果时发出颜色。我们也可以添加 --use-color 来启用 less UI 的彩色化。

例如,将 LESS 环境变量设置为 --RAW-CONTROL-CHARS --use-color -Dd+r -Du+b 将为加粗文本设置红色,为下划线文本设置蓝色。

有关更多信息,请参阅 less(1) § D[1]

从 stdin 读取

注意 建议通过 #环境变量 添加彩色输出,因为下面的内容假定 LESS 设置为包含 -R

当您运行一个命令并将其 标准输出 (stdout) 管道到 less 进行分页查看(例如 pacman -Qe | less)时,您可能会发现输出不再是彩色的。这通常是因为程序试图检测其 stdout 是否是交互式终端,如果是,则打印彩色文本,否则打印无色文本。当您想将 stdout 重定向到文件时(例如 pacman -Qe > pkglst-backup.txt),这是个好行为,但当您想在 less 中查看输出时,则不太合适。

一些程序提供了一个选项来禁用交互式 tty 检测。

# dmesg --color=always | less

如果程序不提供任何类似选项,可以通过以下实用程序来欺骗程序,使其认为其 stdout 是交互式终端。

  • ColorThis — 通过在一个(一组)伪终端中运行程序来强制彩色化程序的输出,支持转发 stdin。
https://github.com/Sasasu/ColorThis || colorthis-gitAUR
  • stdoutisatty — 一个小型程序和一个可 LD_PRELOAD 的库,用于捕获 isatty(3) 函数调用。
https://github.com/lilydjwg/stdoutisatty。 || stdoutisatty
示例: stdoutisatty program | less
  • unbuffer — 一个 tclsh 脚本,随 expect 一起提供,它在伪终端中调用所需的程序。
unbuffer(1) || expect
示例: unbuffer program | less

或者,使用 zshzpty 模块:[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
}

用法

$ ptyless program

将其管道到其他分页器(此处以 less 为例)

$ pty program | less

ls

--color=auto 选项启用颜色高亮。颜色代码仅在标准输出中发出;不进入管道或重定向。

使用 别名永久启用此选项

alias ls='ls --color=auto'

LS_COLORS 变量用于定义颜色,它配置高亮的各个部分。使用 dircolors(1) 命令进行设置。

dircolors 的一个高级替代品,附带许多主题,是 vivid 包,请参阅 vivid --help 以获取用法。

注意ls 在包含大量条目的目录中运行时,使用 --color 选项可能会带来明显的性能损失。默认设置要求 ls 对它列出的每个文件执行 stat(1)。但是,如果您想要大多数文件类型着色,但可以不使用其他着色选项(例如,可执行文件、孤立文件、粘滞位、其他可写、能力),请使用 dircolors 设置 LS_COLORS 环境变量,如下所示:
eval $(dircolors -p | perl -pe 's/^((CAP|S[ET]|O[TR]|M|E)\w+).*/$1 00/' | dircolors -)

有关更多信息,请参阅 ls(1)

man

grotty(1)man 使用的默认后处理器)中有一个真正的彩色功能,但强烈不建议将其用于 man 页。下面的大多数选项都通过替换加粗、突出显示和下划线序列为包含颜色的特殊序列来模拟彩色 man 页。

使用 less

首先,执行以下任一操作:

  • 在所有地方启用 less 中的彩色化,如 #less 所示。
  • 仅在 man 时启用 less 中的彩色化,通过将 MANPAGER 环境变量设置为(例如)less --use-color -Dd+r -Du+b。由于下面的选项,不需要 --RAW-CONTROL-CHARS 选项。

然后,您需要禁用 grotty(1) 后处理器中的 SGR/OSC 转义序列,因为它们与 less 不兼容。[3] 这通过 nroff(1)-P 选项传递,您可以通过将 MANROFFOPT 环境变量设置为 -P -c 来应用此选项。

使用 most

most 的基本功能与 lessmore 类似,但功能集较小。配置 most 使用颜色比使用 less 容易,但需要额外的配置才能使 most 表现得像 less。安装 most 包。

编辑 /etc/man_db.conf,取消注释分页器定义并将其更改为:

DEFINE     pager     most -s

通过键入以下命令测试新设置:

$ man whatever_man_page

修改颜色值需要编辑 ~/.mostrc(如果文件不存在则创建)或编辑 /etc/most.conf 进行系统范围的更改。示例 ~/.mostrc

% Color settings
color normal lightgray black
color status yellow blue
color underline yellow black
color overstrike brightblue black


使用 bat

bat 可用作 man 的彩色化分页器,通过设置 MANPAGER 环境变量 如此处所述

使用 X 资源

xterm/uxtermrxvt-unicode 上查看 man 页时添加颜色的一个快速方法是修改 ~/.Xresources

xterm
*VT100.colorBDMode:     true
*VT100.colorBD:         red
*VT100.colorULMode:     true
*VT100.colorUL:         cyan

这会用颜色 *替换* 装饰。另外添加:

*VT100.veryBoldColors: 6

如果您想同时拥有颜色和装饰(加粗或下划线)。有关更多信息,请参阅 xterm(1) § veryBoldColors

rxvt-unicode
URxvt.colorIT:      #87af5f
URxvt.colorBD:      #d7d7d7
URxvt.colorUL:      #87afd7

运行

$ xrdb -load ~/.Xresources

启动一个新的 xterm/uxtermrxvt-unicode,您应该会看到彩色的 man 页。

此组合在 xterm/uxterm 中为 **加粗** 和 下划线 文本添加颜色,在 rxvt-unicode 中为 **加粗**、下划线 和 *斜体* 文本添加颜色。您可以尝试不同组合的这些属性。请参阅 源文件(已存档)。

pacman

Pacman 有一个颜色选项。取消注释 /etc/pacman.conf 中的 Color 行。

包装器

本文档或部分是迁移到 [[]] 的候选。

说明: 其中一些可以独立成节,或者移至现有节,例如 #diff。(在 Talk:Color output in console 中讨论)

通用包装器

(大部分已过时,但仍然有效)

它们附带多种预配置的预设,可以进行更改,也可以创建/贡献新的预设。

警告 包装器会用转义序列替换命令的输出。一些使用标准 shell 实用程序输出的 shell 脚本和程序可能无法正常工作。
  • rainbow — 使用模式为命令输出或 STDIN 添加颜色。
    预设:df、diff、env、host、ifconfig、java-stack-trace、jboss、jonas、md5sum、mvn2、mvn3、ping、tomcat、top、traceroute。
https://github.com/nicoulaj/rainbow || rainbowAUR
  • grc — 另一个用于美化日志文件或命令输出的着色器。
    预设: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 和 tcpdump。
https://github.com/garabik/grc || grc
  • cope — 一个彩色的终端程序包装器。
    预设: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-gitAUR
  • cw — 一个非侵入性的实时 ANSI 彩色包装器,用于常见的类 Unix 命令。包装了 file,这可能会导致问题。
    预设: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/ || cwAUR
  • ccze — 用 C 编写的快速日志着色器,旨在作为 colorize 的即插即用替代品。
https://github.com/cornet/ccze/ || cczeAUR

用于彩色化输出的库

  • libtextstyle — 一个 C 库,用于为终端中的文本输出添加样式。
https://gnu.ac.cn/software/gettext/libtextstyle/manual/index.html || gettext
  • ruby-rainbow — Rainbow 是 Ruby 的 String 类的扩展,增加了对 ANSI 终端中文本着色的支持。
https://rubygems.org.cn/gems/rainbow/ || ruby-rainbow
  • python-blessings — 一个简洁实用的库,用于包装终端着色、样式和定位。
https://github.com/erikrose/blessings || python-blessingsAUR
  • lolcat — Ruby 程序,使输出像彩虹一样色彩丰富。
https://github.com/busyloop/lolcat/ || lolcat

特定于应用程序

编译器

  • colorgcc — 一个 Perl 包装器,用于彩色化编译器输出中的警告/错误消息,匹配 gcc 的输出格式。
https://github.com/colorgcc/colorgcc || colorgcc

diff

Diff 具有 内置的彩色输出,使用它比较合理。但也可以使用以下包装器:

  • colordiff — 用于 diff 高亮的 Perl 脚本。
https://www.colordiff.org/ || colordiff
  • cwdiff — (w)diff 包装器,支持目录和高亮。
https://github.com/junghans/cwdiff || cwdiffAUR
  • git-delta — git 和 diff 输出的语法高亮分页器。
https://github.com/dandavison/delta || git-delta

cat

  • bat — Cat 克隆,具有语法高亮和 git 集成。
https://github.com/sharkdp/bat || bat

less

source-highlight

您可以启用 less 中的代码语法着色。首先,安装 source-highlight,然后将以下行添加到您的 shell 配置文件中:

~/.bashrc
export LESSOPEN="| /usr/bin/source-highlight-esc.sh %s"
export LESS='-R '
lesspipe

命令行界面的频繁用户可能希望安装 lesspipe

用户现在可以使用他们的分页器列出存档中的压缩文件。

$ 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 还使 less 能够与存档以外的文件进行交互,作为与该文件类型关联的特定命令的替代方案(例如,通过 python-html2text 查看 HTML)。

安装 lesspipe 后重新登录以激活它,或 source /etc/profile.d/lesspipe.sh

Make

  • colormake — 一个简单的 make 包装器,使输出更具可读性。
https://github.com/pagekite/Colormake/ || colormakeAUR

Ping

  • prettyping — 为 ping 监控添加一些很棒的功能。一个包装标准 ping 工具的包装器,旨在使输出更美观、更丰富多彩、更紧凑、更容易阅读。
https://denilson.sa.nom.br/prettyping/ || prettyping

Shell

bash

请参阅 Bash/Prompt customization#Colors

Fish

请参阅 Fish#Web interface

xonsh

请参阅 Customizing the Prompt

zsh

请参阅 Zsh#Colors

终端模拟器

虚拟控制台

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 对于“颜色”的含义不够清晰,即在 #Virtual console 中,它们是关于 16 种基本颜色的 *表示* (黄色、红色、蓝色等的 RGB 值),而在 #Login screen 中,它们是关于基本颜色本身。另请参阅 console_codes(4)User:Isacdaavid/Linux_Console。(在 Talk:Color output in console 中讨论)

可以在 Linux 虚拟控制台 帧缓冲器上运行的颜色进行更改。这是通过写入转义码 \\e]PXRRGGBB 来完成的,其中 X 是颜色的十六进制索引,从 0-F,RRGGBB 是传统的十六进制 RGB 代码。

例如,要重用 ~/.Xresources 中定义的现有颜色,请将以下内容添加到 shell 初始化文件(例如 ~/.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

登录屏幕

下面是 /etc/issue 中虚拟控制台登录屏幕的彩色示例。以 root 身份使用 mv /etc/issue /etc/issue.bak 备份原始文件,然后创建一个新的 /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 

参见

X 窗口系统

大多数 Xorg 终端,包括 xtermurxvt,都支持至少 16 种基本颜色。颜色 0-7 是“正常”颜色。颜色 8-15 是它们的“明亮”对应色,用于高亮显示。这些颜色可以通过 X 资源或通过特定终端设置进行修改。例如:

~/.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
警告 颜色资源(如 foregroundbackground)可以被其他应用程序(如 emacs)读取。这可以通过指定类名来避免,例如 XTerm.foreground

参见

使用 tput 设置前景色和背景色

设置加粗、黄色文本、蓝色背景的示例

$ tput bold; tput setaf 3; tput setab 4
tput 命令行选项速查表
tput 命令 描述
tput bold 粗体文本
tput setaf [CODE] 设置前景色
tput setab [CODE] 设置背景色
tput rev 反转颜色
tput sgr0 重置所有
tput 颜色代码
tput color [CODE] 颜色
0 黑色
1 红色
2 绿色
3 黄色
4 蓝色
5 品红色
6 青色
7 白色

示例:在屏幕上打印256种颜色

$ (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)

显示tput转义码

本文或本节候选合并到 Bash/Prompt_customization

注意:Talk:Color output in console中有关于tput的更多背景信息(讨论)。

tput op替换为您想跟踪的任何tput命令。op是默认的前景色和背景色。

$ ( 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

枚举支持的颜色

以下命令将让您发现终端机支持的所有terminfo,以及每种终端机支持的颜色数量。可能的值为:8、15、16、52、64、88和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

颜色方案脚本

参见[4],其中包含显示当前终端颜色方案图表的脚本。

真彩色支持

一些终端机支持全部1600万种颜色(RGB,每种8位分辨率):xterm、konsole、st等。在ncurses版本6.1[5]及更高版本中支持相应的TERM值xterm-directkonsole-directst-direct等。有关支持真彩色的终端模拟器和应用程序的更多信息,请参阅[6]

请注意,Linux内核支持用于真彩色的SGR(Select Graphic Rendition)转义序列,但使用它没有意义,因为驱动程序会将24位颜色规格映射到内核中的256色调色板(请参阅函数rgb_foregroundrgb_background)。因此,没有terminfo条目linux-direct

参见