ps1颜色配置必须用[和]包裹ansi转义序列,否则光标定位错乱;前景色代码30–37,末尾须用[\033[0m]重置,且需区分终端模拟器配色与ps1局部配色。

PS1 颜色配置必须用 \[ 和 \] 包裹转义序列
直接写 \033[32m 会导致命令行光标定位错乱、历史记录换行异常、补全显示偏移——这是最常被忽略的硬性规则。Shell 把 ANSI 转义序列当成可见字符计算长度,\[ 和 \] 的作用是告诉 Bash:“这段只是控制码,不算显示宽度”。
错误写法:PS1='\033[1;32m\u@\h:\w\$ \033[0m'(光标会漂移)
正确写法:PS1='\[\033[1;32m\]\u@\h:\w\$ \[\033[0m\]'
-
\[和\]必须成对出现,且只包住\033[...m类控制码 - 前景色代码范围是
30–37(黑/红/绿/黄/蓝/紫/青/白),加1;表示高亮,如\033[1;33m是亮黄色 - 不要在 PS1 里混用
\e和\033,虽然等价,但统一用\033更稳妥 - 末尾务必重置颜色:
\[\033[0m\],否则后续所有输出(比如ls结果)都会带色
区分终端模拟器配色和 Shell 提示符配色
很多人调了半天 PS1 发现颜色不对,其实是混淆了两层:GNOME Terminal 自身的“文字/背景色”(图形界面设置)和 Shell 提示符里用 ANSI 控制的“局部文字色”。前者影响所有输出,后者只影响提示符本身。
查当前终端配色:运行 gsettings get org.gnome.Terminal.Legacy.Profile:/org/gnome/terminal/legacy/profiles:/:$(gsettings get org.gnome.Terminal.ProfilesList default | tr -d \')'/ foreground-color
- 如果想改整个终端的文字底色,用
gsettings set ... foreground-color '#FFFFFF',不是动PS1 -
PS1配色只在提示符生效,不影响cat、grep等命令输出(除非它们自己带颜色) - 某些主题(如 Yaru)会覆盖终端默认色,此时需先确认 profile ID 是否变化:
gsettings get org.gnome.Terminal.ProfilesList list
bash 与 zsh 的 PS1 变量语法差异
如果你切到了 zsh(比如装了 Oh My Zsh),别直接套用 bash 的 PS1 写法——zsh 默认用 PROMPT,且支持更简洁的语法,但兼容模式下也能读 PS1。不过混合使用容易出问题。
- bash:必须用
\[/\]+\033,变量如\u(用户)、\w(路径)全小写 - zsh:推荐用
%n(用户)、%~(路径),颜色用%F{green}更安全,例如PROMPT='%F{blue}%n%f@%F{yellow}%m%f:%F{cyan}%~%f$ ' - 混用风险:在 zsh 里 source 一个含 bash 风格
PS1的脚本,可能因未关闭 color_prompt 导致斜杠渲染异常 - 验证当前 shell:
echo $SHELL,别只看$0,它可能被覆盖
路径过长时自动截断而非换行
默认 \w 在深层目录下会撑满整行,敲命令时只剩半行空间。这不是配色问题,但和视觉体验强相关,必须一起调。
- bash 下用
\W只显示最后一级目录名,但丢失路径结构感 - 更优解是用
\${PWD/#$HOME/~}替代\w,再配合truncate逻辑(需函数封装) - 简单有效方案:在
PS1里把路径部分用\[\033[2m\](暗色)降低视觉权重,例如\[\033[2m\]\w\[\033[0m\] - zsh 用户可直接启用
TRUNCATE_PATH选项或使用%3~显示最后三级目录
PS1 后,务必关掉所有终端窗口再新开——仅 source ~/.bashrc 无法重置某些已缓存的配色状态。











