1. 为什么命令行总是“难看又伤眼”
先聊点实际的。打开 Linux 终端,默认的黑底白字、密密麻麻的输出,很多人第一反应是“能忍就先忍”,直到某天盯着屏幕排查故障,眼睛酸到不行,才开始认真考虑:字体能不能调大点?颜色能不能区分出重点?这个问题不解决,日常使用 Linux 命令行的时间越长,效率损耗就越明显。
先说清楚一个容易被搞晕的点:命令行里你看到的字体和颜色,其实是由两套完全不同的机制在控制的。字体大小由终端模拟器(gnome-terminal、konsole、xfce4-terminal、vscode 内置终端等)决定,它本质上是图形界面程序,负责把文字“画”到屏幕上;而颜色则分两层——终端模拟器有自己默认的调色板,shell 和各个命令行工具(ls、grep、vim、git)再通过 ANSI 转义序列去调用这些颜色。你调一个,另一个人家没动,就会出现“PS1 是彩色的,但 ls 列目录还是一团白”这种很常见的半调子体验。
这篇文章要讲的,就是把这两套机制彻底捋清楚:终端层怎么改字体和配色,shell 层怎么用转义序列精准控制颜色,以及常见的坑在哪。适合谁看?运维、开发、刚转 Linux 桌面的新手都适用,甚至右侧编辑器里内置终端的配色问题也能一并解决。我尽量不多讲理论,直接给能抄的配置和命令。
有一个常见的误解得先破除:很多人以为在 shell 里执行一条命令、或改个环境变量,就能改变终端显示的字号。实际上 shell 只是一个文本通道,绝大多数 Linux 终端模拟器并不支持“通过输出字符改变字体大小”,只有少数终端(比如 macOS 下的 iTerm2)支持 OSC 50 之类的转义序列。所以在 SSH 远程会话里想把字调大,正确做法是调本地终端模拟器的字号,不是去服务器上敲命令。这个我们放到后面字体部分详细展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 颜色设置:先搞清楚 ANSI 转义序列的底层逻辑
2.1 提示符 PS1 美化:三分钟见效的起步配置
shell 提示符(就是那个 user@host:~$)是命令行里颜色最直观的展示位置。想要彩色提示符,核心就是往 PS1 环境变量里塞 ANSI 转义序列。格式长这样:
bash复制export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
拆开解释一下:
\[\033[是转义序列的开始,\]是结束标记,这两层方括号是告诉 bash “这里的内容不算实际字符长度”,防止命令行换行错位。01;32m表示“加粗 + 绿色”,\u是当前用户,\h是主机名,\w是当前工作目录完整路径。\033[00m是颜色重置符,作用是把后续输出恢复正常,不然整个命令行都会是绿的。
这套写法适合直接用,但硬编码数字可读性差。更推荐用 tput 命令来自动生成转义码,兼容性更好,尤其是在不同的终端类型(比如 xterm-256color 和 linux 控制台)之间切换时,不会出现显示错乱:
bash复制# 先定义颜色变量
GREEN=$(tput setaf 2)
BLUE=$(tput setaf 4)
RESET=$(tput sgr0)
export PS1="\[$GREEN\]\u@\h\[$RESET\]:\[$BLUE\]\w\[$RESET\]\$ "
tput setaf 1 到 7 分别对应红、绿、黄、蓝、紫、青、白七种标准色。比起手写 \033[31m,tput 的好处是底层会自动适应当前终端的 terminfo 类型,基本不会出现“序列没被解析、直接显示 [01;32m 一堆乱码”的情况。
实际生产环境中,我一般不建议把 PS1 做得花里胡哨,原因很实在:日志里如果记录了 shell 命令,用户复制带有太多转义码的提示符容易带出不可见字符;而且高亮色用太多反而分不清主次。真正有用的颜色点是:管理员用户(root)的提示符用红色背景警告、普通用户用绿色,区分身份避免误操作。
2.2 ls 文件列表颜色:dircolors 的正确用法
Linux 命令行下第二个高频配色需求就是 ls。默认的 ls 输出只有文件名的白字,加上颜色才能快速区分目录、可执行文件、符号链接、压缩包等类型。
ls 的颜色控制有两个层级:
- 环境变量
LS_COLORS,它是一个形如di=01;34:ln=01;36:ex=01;32的冒号分隔字符串,每个字段对应一种文件类型。 - 命令
dircolors,负责按配置文件生成LS_COLORS环境变量。
手动手写 LS_COLORS 容易漏字段,最省事的做法是先把当前系统默认值导出成配置文件,再改:
bash复制# 生成当前 shell 的 LS_COLORS 配置到文件
dircolors --print-database > ~/.dir_colors
# 修改 ~/.dir_colors 后,在 ~/.bashrc 里加载
eval "$(dircolors -b ~/.dir_colors)"
.dir_colors 文件里的每一行就是映射规则,比如:
code复制# 目录:加粗蓝色
DIR 01;34
# 符号链接:青色
LINK 01;36
# 可执行文件:加粗绿色
EXEC 01;32
# 压缩包:加粗红色
.tar 01;31
关键是理解后面的 01;31 这段数字。分号分隔的两部分,前半段是样式(00 正常、01 加粗、04 下划线、05 闪烁),后半段是颜色编号(30-37 是标准色,38;5;NNN 是 256 色模式,90-97 是亮色)。比如想让目录在 256 色模式下显示为橙黄色:
code复制DIR 38;5;208
改完配置后执行 source ~/.bashrc 或者重开终端即可生效。注意 eval "$(dircolors -b ~/.dir_colors)" 必须写在 .bashrc 里且放在任何使用 ls 的别名定义之前,不然 `alias ls='ls
