控制台彩色输出

出自 ArchWiki

此条目或章节需要扩充。

理由: 也许可以创建更大的内容。如果您可以添加一些有价值的信息,请积极参与。提及 python-pywal。(在 Talk:Color output in console#Why and what this page is about 中讨论)

此条目或章节需要改进语言、wiki 语法或风格。请参考 Help:Style

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

创建此页面是为了整合 CLI 输出的着色。

背景

此条目或章节需要扩充。

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

转义序列

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

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

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

较少支持的是真彩色模式,允许您在 RGB 中使用 1670 万 (224) 种颜色(每个值的范围从 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 中使用彩色输出对于 regexp 任务也很有用。

使用 别名 永久启用此选项

alias grep='grep --color=auto'

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

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

ip

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

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

alias ip='ip -color=auto'

less

环境变量

#man 情况一样,我们可以告诉 less 在它打算制作粗体文本和其他格式效果时发出颜色。

将以下行添加到您的 shell 配置文件

export LESS='-R --use-color -Dd+r$Du+b$'

它将为粗体设置红色,为下划线设置蓝色。

有关 --use-color-D 选项的更多信息,请参阅 less(1) § D[1]

从标准输入读取

注意: 建议通过 #环境变量 将彩色输出添加到您的 ~/.bashrc~/.zshrc 中,因为以下内容基于 export LESS='-R'

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

某些程序提供禁用交互式 tty 检测的选项

# dmesg --color=always | less

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

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

或者,使用 zpty 模块,来自 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
}

用法

$ 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) 它列出的每个文件。但是,如果您想要大多数文件类型着色,但可以不使用其他着色选项(例如,可执行、孤立、粘滞、其他可写、能力),请使用 dircolorsLS_COLORS 环境变量设置为如下所示
eval $(dircolors -p | perl -pe 's/^((CAP|S[ET]|O[TR]|M|E)\w+).*/$1 00/' | dircolors -)

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

man

此条目或章节需要改进语言、wiki 语法或风格。请参考 Help:Style

理由: grotty 实用程序仅在简介中提及 - 它实际在哪里使用?此外,还有比 lessmost 更多的子章节。(在 Talk:Color output in console 中讨论)

grotty(1) 中有一个真正的颜色工具,但不建议用于 man 页面。在这里,我们通过破解两个主要分页器 lessmost 来伪造彩色 man:我们用包含颜色的 spiced 序列替换粗体、突出显示和下划线的序列。

使用 bat

通过设置 MANPAGER 环境变量 如此处文档所述bat 可以用作 man 的着色分页器。

使用 less

有关更详细的描述,请参阅 #less

export MANPAGER="less -R --use-color -Dd+r -Du+b"
export MANROFFOPT="-P -c"

对于 Fish,您可以使用以下方法完成此操作

~/.config/fish/config.fish
set -xU MANPAGER 'less -R --use-color -Dd+r -Du+b'
set -xU MANROFFOPT '-P -c'

请记住 source 您的配置或重启您的 shell 以使更改生效。

使用 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

使用 X 资源

xterm/uxtermrxvt-unicode 上查看的手册页添加颜色的快速方法是修改 ~/.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,您应该会看到彩色的手册页。

此组合将颜色应用于 xterm/uxterm 中的粗体下划线单词,或应用于 rxvt-unicode 中的粗体下划线斜体文本。您可以尝试这些属性的不同组合。请参阅此项目的 来源 (已存档)。

pacman

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

封装器

此条目或章节是移动到 [[ ]] 的候选对象。

注释: 其中一些可以制作成它们自己的章节,或移动到现有章节,例如 #diff(在 Talk:Color output in console 中讨论)

通用封装器

(它们中的大多数已过时,但仍然可以正常工作)

它们带有多个预配置的预设,可以更改,并且可以创建/贡献新的预设。

警告: 封装器会用转义序列替换命令的输出。某些使用标准 shell 实用程序输出的 shell 脚本和程序可能无法正常工作。
  • rainbow — 使用模式为命令输出或标准输入着色。
    预设: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 — 常见基于 unix 的命令的非侵入式实时 ANSI 彩色封装器。封装了 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://schlueters.de/colorgcc.html[失效链接 2024-03-03 ⓘ] || 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 — 具有语法高亮和 git 集成的 Cat 克隆。
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

请参阅 自定义提示符

zsh

请参阅 Zsh#Colors

终端模拟器

虚拟控制台

此条目或章节需要改进语言、wiki 语法或风格。请参考 Help:Style

理由: 不清楚“颜色”是什么,例如在 #虚拟控制台 中,它们是关于 16 种基本颜色(黄色、红色、蓝色等的 RGB 值)的表示,而在 #登录界面 中,它们是关于基本颜色本身。另请参阅 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 中虚拟控制台登录界面的彩色示例。使用 mv /etc/issue /etc/issue.bak 以 root 身份创建原始文件的备份,并创建一个新的 /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 [代码] 设置前景色
tput setab [代码] 设置背景色
tput rev 反色
tput sgr0 重置所有设置
tput 颜色代码
tput color [代码] 颜色
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 合并。

注意:该条目提供了关于 tput 的更多上下文(在 Talk:Color output in console 中讨论)

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

枚举终端功能

此条目或章节可能需要与 Bash/Prompt_customization 合并。

注意:该条目提供了关于 tput 的更多上下文(在 Talk:Color output in console 中讨论)

此命令可用于查看您的终端支持哪些功能。

$ infocmp -1 | tr -d '\0\t,' | cut -f1 -d'=' | grep -v "$TERM" | sort | column -c80
acsc		ed		kcuu1		kich1		rmso
am		el		kDC		kLFT		rmul
bce		el1		kdch1		km		rs1
bel		enacs		kel		kmous		rs2
blink		eo		kend		knp		s0ds
bold		flash		kEND		kNXT		s1ds
btns#5		fsl		kent		kpp		s2ds
bw		home		kf1		kPRV		s3ds
ccc		hpa		kf10		kRIT		sc
civis		hs		kf11		kslt		setab
clear		ht		kf12		lines#24	setaf
cnorm		hts		kf13		lm#0		setb
colors#0x100	ich		kf14		mc0		setf
cols#80		ich1		kf15		mc4		sgr
cr		il		kf16		mc5		sgr0
csr		il1		kf17		mc5i		sitm
cub		ind		kf18		mir		smacs
cub1		indn		kf19		msgr		smam
cud		initc		kf2		ncv#0		smcup
cud1		is1		kf20		npc		smir
cuf		is2		kf3		op		smkx
cuf1		it#8		kf4		pairs#0x7fff	smso
cup		ka1		kf5		rc		smul
cuu		ka3		kf6		rev		tbc
cuu1		kb2		kf7		ri		tsl
cvvis		kbs		kf8		rin		u6
dch		kc1		kf9		ritm		u7
dch1		kc3		kfnd		rmacs		u8
dl		kcbt		kFND		rmam		u9
dl1		kcub1		kHOM		rmcup		vpa
dsl		kcud1		khome		rmir		xenl
ech		kcuf1		kIC		rmkx		xon

配色方案脚本

请参阅 [3] 获取显示当前终端配色方案图表的脚本。

真彩色支持

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

请注意,Linux 内核支持真彩色的 SGR(选择图形再现)转义序列,但使用它是没有意义的,因为驱动程序将 24 位颜色规范映射到内核中的 256 色颜色映射(请参阅函数 rgb_foregroundrgb_background)。因此,没有 terminfo 条目 linux-direct

参见