使 Linux 变得丰富多彩(或单色)。
你可以使用特殊的 ANSI 编码设置为 Linux 终端添加颜色,可以在终端命令或配置文件中动态添加,也可以在终端仿真器中使用现成的主题。无论哪种方式,你都可以黑色屏幕上找回怀旧的绿色或琥珀色文本。本文演示了如何使 Linux 变得丰富多彩(或单色)的方法。
终端的功能特性
现代系统的终端的颜色配置通常默认至少是 xterm-256color,但如果你尝试为终端添加颜色但未成功,则应检查你的 TERM
设置。
从历史上看,Unix 终端从字面上讲是:用户可以输入命令的共享计算机系统上实际的物理端点(终点)。它们专指通常用于远程发出命令的电传打字机(这也是我们今天在 Linux 中仍然使用 /dev/tty
设备的原因)。终端内置了 CRT 显示器,因此用户可以坐在办公室的终端上直接与大型机进行交互。CRT 显示器价格昂贵 —— 无论是制造还是使用控制;比担心抗锯齿和现代计算机专家理所当然认为的漂亮信息,让计算机吐出原始 ASCII 文本更容易。然而,即使在那时,技术的发展也很快,很快人们就会发现,随着新的视频显示终端的设计,他们需要新的功能特性来提供可选功能。
例如,1978 年发布的花哨的新 VT100 支持 ANSI 颜色,因此如果用户将终端类型识别为 vt100,则计算机可以提供彩色输出,而基本串行设备可能没有这样的选项。同样的原则适用于今天,它是由 TERM
环境变量设定的。你可以使用 echo
检查你的 TERM
定义:
$ echo $TERM
xterm-256color
过时的(但在一些系统上仍然为了向后兼容而维护)/etc/termcap
文件定义了终端和打印机的功能特性。现代的版本是 terminfo
,位于 /etc
或 /usr/share
中,具体取决于你的发行版。 这些文件列出了不同类型终端中可用的功能特性,其中许多都是由历史上的硬件定义的,如 vt100 到 vt220 的定义,以及 xterm 和 Xfce 等现代软件仿真器。大多数软件并不关心你使用的终端类型; 在极少数情况下,登录到检查兼容功能的服务器时,你可能会收到有关错误的终端类型的警告或错误。如果你的终端设置为功能特性很少的配置文件,但你知道你所使用的仿真器能够支持更多功能特性,那么你可以通过定义 TERM
环境变量来更改你的设置。你可以通过在 ~/.bashrc
配置文件中导出 TERM
变量来完成此操作:
export TERM=xterm-256color
保存文件并重新载入设置:
$ source ~/.bashrc
ANSI 颜色代码
现代终端继承了用于“元”特征的 ANSI 转义序列。这些是特殊的字符序列,终端将其解释为操作而不是字符。例如,此序列将清除屏幕,直到下一个提示符:
$ printf '\033[2J'
它不会清除你的历史信息;它只是清除终端仿真器中的屏幕,因此它是一个安全且具有示范性的 ANSI 转义序列。
ANSI 还具有设置终端颜色的序列。例如,键入此代码会将后续文本更改为绿色:
$ printf '\033[32m'
只要你对相同的计算机使用同一个颜色,就可以使用颜色来帮助你记住你登录的系统。例如,如果你经常通过 SSH 连接到服务器,则可以将服务器的提示符设置为绿色,以帮助你一目了然地将其与本地的提示符区分开来。 要设置绿色提示符,请在提示符前使用 ANSI 代码设置为绿色,并使用代表正常默认颜色的代码结束:
export PS1=`printf "\033[32m$ \033[39m"`
前景色和背景色
你不仅可以设置文本的颜色。使用 ANSI 代码,你还可以控制文本的背景颜色以及做一些基本的样式。
例如,使用 \033[4m
,你可以为文本加上下划线,或者使用 \033[5m
你可以将其设置为闪烁的文本。起初这可能看起来很愚蠢,因为你可能不会将你的终端设置为所有文本带有下划线并整天闪烁, 但它对某些功能很有用。例如,你可以将 shell 脚本生成的紧急错误设置为闪烁(作为对用户的警报),或者你可以为 URL 添加下划线。
作为参考,以下是前景色和背景色的代码。前景色在 30 范围内,而背景色在 40 范围内:
颜色 | 前景色 | 背景色 |
---|---|---|
黑色 | \033[30m | \033[40m |
红色 | \033[31m | \033[41m |
绿色 | \033[32m | \033[42m |
橙色 | \033[33m | \033[43m |
蓝色 | \033[34m | \033[44m |
品红 | \033[35m | \033[45m |
青色 | \033[36m | \033[46m |
浅灰 | \033[37m | \033[47m |
回退到发行版默认值 | \033[39m | \033[49m |
还有一些可用于背景的其他颜色:
颜色 | 背景色 |
---|---|
深灰 | \033[100m |
浅红 | \033[101m |
浅绿 | \033[102m |
黄色 | \033[103m |
浅蓝 | \033[104m |
浅紫 | \033[105m |
蓝绿 | \033[106m |
白色 | \033[107m |
持久设置
在终端会话中设置颜色只是暂时的,相对无条件的。有时效果会持续几行;这是因为这种设置颜色的方法依赖于 printf
语句来设置一种模式,该模式仅持续到其他设置覆盖它。
终端仿真器通常获取使用哪种颜色的指令的方式来自于 LS_COLORS
环境变量的设置,该设置又由 dircolors
的设置填充。你可以使用 echo
语句查看当前设置:
$ echo $LS_COLORS
rs=0:di=38;5;33:ln=38;5;51:mh=00:pi=40;
38;5;11:so=38;5;13:do=38;5;5:bd=48;5;
232;38;5;11:cd=48;5;232;38;5;3:or=48;
5;232;38;5;9:mi=01;05;37;41:su=48;5;
196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;
196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;
[...]
或者你可以直接使用 dircolors
:
$ dircolors --print-database
[...]
# image formats
.jpg 01;35
.jpeg 01;35
.mjpg 01;35
.mjpeg 01;35
.gif 01;35
.bmp 01;35
.pbm 01;35
.tif 01;35
.tiff 01;35
[...]
这看起来很神秘。文件类型后面的第一个数字是属性代码,它有六种选择:
- 00 无
- 01 粗体
- 04 下划线
- 05 闪烁
- 07 反白
- 08 暗色
下一个数字是简化形式的颜色代码。你可以通过获取 ANSI 代码的最后一个数字来获取颜色代码(绿色前景为 32,绿色背景为 42;红色为 31 或 41,依此类推)。
你的发行版可能全局设置了 LS_COLORS
,因此系统上的所有用户都会继承相同的颜色。如果你想要一组自定义的颜色,可以使用 dircolors
。首先,生成颜色设置的本地副本:
$ dircolors --print-database > ~/.dircolors
根据需要编辑本地列表。如果你对自己的选择感到满意,请保存文件。你的颜色设置只是一个数据库,不能由 ls 直接使用,但你可以使用 dircolors
获取可用于设置 LS_COLORS
的 shellcode:
$ dircolors --bourne-shell ~/.dircolors
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:
pi=40;33:so=01;35:do=01;35:bd=40;33;01:
cd=40;33;01:or=40;31;01:mi=00:su=37;41:
sg=30;43:ca=30;41:tw=30;42:ow=34;
[...]
export LS_COLORS
将输出复制并粘贴到 ~/.bashrc
文件中并重新加载。或者,你可以将该输出直接转储到 .bashrc
文件中并重新加载。
$ dircolors --bourne-shell ~/.dircolors >> ~/.bashrc
$ source ~/.bashrc
你也可以在启动时使 Bash 解析 .dircolors
而不是手动进行转换。实际上,你可能不会经常改变颜色,所以这可能过于激进,但如果你打算改变你的配色方案,这是一个选择。在 .bashrc
文件中,添加以下规则:
[[ -e $HOME/.dircolors ]] && eval "`dircolors --sh $HOME/.dircolors`"
如果你的主目录中有 .dircolors
文件,Bash 会在启动时对其进行评估并相应地设置 LS_COLORS
。
颜色
在终端中使用颜色是一种可以为你自己提供特定信息的快速视觉参考的简单方法。但是,你可能不希望过于依赖它们。毕竟,颜色不是通用的,所以如果其他人使用你的系统,他们可能不会像你那样看懂颜色代表的含义。此外,如果你使用各种工具与计算机进行交互,你可能还会发现某些终端或远程连接无法提供你期望的颜色(或根本不提供颜色)。
除了上述警示之外,颜色在某些工作流程中可能很有用且很有趣,因此创建一个 .dircolor
数据库并根据你的想法对其进行自定义吧。