终端配色需协同PS1、LS_COLORS和终端模拟器三者:PS1用[ ]包裹ANSI码或tput变量防光标错乱;ls颜色依赖alias --color=auto、正确$TERM及dircolors加载~/.dircolors;终端底色须在对应模拟器配置中修改。

改终端颜色不是改一个地方的事——PS1 控制提示符(比如 user@host:~$)的颜色,LS_COLORS 控制 ls 输出的文件/目录高亮,终端模拟器自身还有一套底色和文字色。三者互不干扰,但缺一不可。
PS1 颜色怎么设才不乱码、不卡光标
PS1 里写 ANSI 转义序列必须用 \[ 和 \] 包裹,否则 bash 会把颜色代码算进字符宽度,导致光标定位错乱、输入换行错位。
- 正确写法:
PS1="\[\e[32m\]\u@\h:\w\$ \[\e[0m\]"(绿色用户名 + 重置) - 错误写法:
PS1="\e[32m\u@\h:\w\$ \e[0m"(没包\[/\],后续输入可能覆盖、跳行) - 更安全的做法是用
tput:先定义green=$(tput setaf 2)和reset=$(tput sgr0),再拼进PS1="${green}\u@\h:${reset}\w\$ " - 别在
PS1里直接调用tput命令(如'\$(tput setaf 2)'),每次显示提示符都执行一次,拖慢响应
ls 颜色不生效?先看这三件事
ls 有颜色不是靠“开了开关”就行,它依赖三个硬性条件同时满足:
-
alias ls输出里必须含--color=auto;没有就加一句alias ls='ls --color=auto'到~/.bashrc或~/.zshrc -
$TERM必须是支持颜色的值(如xterm-256color),运行echo $TERM确认;在tmux或screen里常被重设为screen,需手动改回 -
LS_COLORS必须由dircolors加载:执行eval "$(dircolors ~/.dircolors)",且这行必须放在 shell 配置文件顶部或至少不在条件块里被跳过
想改 .pyc、.env 这类后缀的颜色,别碰 LS_COLORS 变量本身
直接改 LS_COLORS 环境变量无效——它是 dircolors 的输出缓存,重启就丢。真正要改的是 ~/.dircolors 文件。
- 首次配置:运行
dircolors -p > ~/.dircolors生成模板 - 添加自定义规则:每行一个,格式严格为
扩展名 颜色码(不带点号),例如:pyc 01;35(粗体紫)、env 01;33(粗体黄) - 生效命令:改完必须重新加载,
eval "$(dircolors ~/.dircolors)",不是source就行 - 注意:
DIR规则会影响所有目录;想只染venv目录,写venv 01;36(要求dircolors≥ 2.0 且启用CLASSIFY)
终端模拟器自身的配色(背景/前景/光标)在哪改
这个和 shell 无关,改错地方重启也没用。不同终端模拟器路径不同:
-
gnome-terminal:图形界面「首选项 → 配置文件 → 颜色」里点选;不生成文件,导出用gsettings get ... palette -
alacritty:改~/.config/alacritty/alacritty.yml中的colors:块 -
wezterm:改~/.wezterm.lua中的colors = { } -
xterm:靠~/.Xresources,例如XTerm*background: #282C34,改完要xrdb -merge ~/.Xresources
最容易被忽略的是:改了终端模拟器配色后,ls、vim、man 不会自动跟着变——它们各自读 LS_COLORS、$TERM、LESS_TERMCAP_*,跟底层终端底色无关。


















