- Published on
"终端美化全记录:从"看不清"到"全平台统一"
- Authors

- 作者
- 子君

终端美化全记录:从"看不清"到"全平台统一"
适用系统:Windows 11(PowerShell 7 + Git Bash)+ Linux 云服务器
最终效果:本地终端、Git Bash、SSH 远程服务器,三处提示符风格统一,白色毛玻璃背景下也清晰可读
目录
- 起点:一个让人抓狂的小问题
- 第一战:PSReadLine 语法高亮配色修复
- 第二战:从 Oh My Posh 迁移到 Starship
- 第三战:Starship 配置与踩坑
- 第四战:让 Git Bash 也用上 Starship
- 第五战:云服务器远程部署
- 最终效果
- 核心教训总结
1. 起点:一个让人抓狂的小问题
1.1 发生了什么
我在 PowerShell 里输入命令连接云服务器:
ssh root@139.155.183.138
ssh 显示为亮黄色,后面的 root@139.155.183.138 显示为白色。而我的 Windows Terminal 背景是白色毛玻璃效果(Acrylic 材质),白字 + 白底 = 几乎看不见。
1.2 为什么会这样
两个工具在协同工作,搞清楚它们的职责是解决问题的关键:
| 工具 | 负责什么 | 我的配置 |
|---|---|---|
| Oh My Posh | 提示符的外观(~/path > 那一行的颜色、图标、Git 信息) | Tokyo Night Storm 主题 |
| PSReadLine | 你输入命令时的语法高亮(ssh 变黄、引号内字符串变色、参数变色等) | 默认配置 |
问题出在 PSReadLine 的默认配色方案:它是为深色背景设计的,DefaultTokenColor(普通文本)默认是白色(ANSI [37m)。在深色背景上很清晰,在白色毛玻璃上就隐身了。
2. 第一战:PSReadLine 语法高亮配色修复
2.1 查看当前配置
在 PowerShell 中执行:
Get-PSReadLineOption | Select-Object *color*
输出示例:
DefaultTokenColor : [37m ← 白色(问题根源)
CommandColor : [93m ← 亮黄色
ParameterColor : [90m ← 亮黑色(灰色)
这些 ANSI 转义码的颜色含义:
| 代码 | 颜色 | 在白色背景上 |
|---|---|---|
[37m | 白色 | ❌ 看不见 |
[93m | 亮黄 | ⚠️ 勉强能看 |
[90m | 亮黑/灰 | ⚠️ 勉强能看 |
2.2 第一次尝试:用 ConsoleColor 枚举(失败 ❌)
我最初的想法很简单——把颜色从"亮"改成"暗":
# ❌ 错误示范 — 不会生效,还会报错
Set-PSReadLineOption -Colors @{
DefaultToken = [ConsoleColor]::DarkGray
Command = [ConsoleColor]::DarkYellow
Parameter = [ConsoleColor]::DarkCyan
}
报错信息:
Set-PSReadLineOption: 'DefaultToken' is not a valid color property
错误分析: -Colors 参数的 Hashtable Key 不叫 DefaultToken。那加个 Color 后缀试试?
2.3 第二次尝试:加 Color 后缀(还是失败 ❌)
# ❌ 还是不对
Set-PSReadLineOption -Colors @{
DefaultTokenColor = [ConsoleColor]::DarkGray
CommandColor = [ConsoleColor]::DarkYellow
ParameterColor = [ConsoleColor]::DarkCyan
}
报错信息:
Set-PSReadLineOption: 'DefaultTokenColor' is not a valid color property
错误分析: 这就有意思了。Get-PSReadLineOption 显示的属性名明明是 DefaultTokenColor,但 Set-PSReadLineOption -Colors 偏偏不认这个 Key。最后试验发现——正确的 Key 既不是 DefaultToken 也不是 DefaultTokenColor,而是 Default:
| Get 属性名(只读) | Set -Colors Key(写入) |
|---|---|
DefaultTokenColor | Default |
CommandColor | Command |
ParameterColor | Parameter |
StringColor | String |
NumberColor | Number |
OperatorColor | Operator |
教训: PowerShell 模块的 getter 和 setter 命名不一定对称,报错了先试试去掉后缀。
2.4 第三次尝试:颜色名对了,但颜色还是浅(仍然不够好 ⚠️)
# ⚠️ Key 对了,但颜色效果不对
Set-PSReadLineOption -Colors @{
Default = [ConsoleColor]::DarkGray
Command = [ConsoleColor]::DarkYellow
Parameter = [ConsoleColor]::DarkCyan
}
这次不报错了,但输入的命令看起来颜色还是偏浅。为什么?
根因分析: 我的 Windows Terminal 配色方案是 Tokyo Night Storm——一个暗色主题。在这个主题下,终端会把 [ConsoleColor]::DarkGray 重新映射为一种在暗底上能看清的浅灰色。所以虽然我写的是 DarkGray,实际渲染出来的还是浅色。
用一张图说明:
你的意图:ConsoleColor::DarkGray → 深灰色(白色背景上可见)
实际映射:Tokyo Night Storm 主题 → 浅灰色(暗色背景上可见)
↑ 正好相反!
2.5 最终方案:24-bit RGB ANSI 转义码,绕过主题映射 ✅
核心思路: 不用 ConsoleColor 枚举(会被终端主题重映射),直接用 24-bit RGB ANSI 转义码,精确指定颜色,完全绕过主题。
# ✅ 最终方案 — 硬编码 RGB,终端主题影响不了
Set-PSReadLineOption -Colors @{
Default = "`e[38;2;60;60;60m" # 普通文本 → 深炭灰 RGB(60,60,60)
Command = "`e[38;2;180;140;20m" # 命令名 → 深琥珀 RGB(180,140,20)
Parameter = "`e[38;2;0;140;140m" # 参数 → 深青 RGB(0,140,140)
String = "`e[38;2;180;80;180m" # 字符串 → 深紫 RGB(180,80,180)
Number = "`e[38;2;60;120;200m" # 数字 → 深蓝 RGB(60,120,200)
Operator = "`e[38;2;100;100;100m" # 操作符 → 中灰 RGB(100,100,100)
}
ANSI RGB 转义码格式解读:
`e[38;2;R;G;Bm
│ │ │ │ │
│ │ │ │ └─ 结束符
│ │ │ └─── Blue (0-255)
│ │ └───── Green (0-255)
│ └──────── Red (0-255)
└──────────── ESC 字符 + 38;2 表示"前景色 24-bit RGB"
小技巧: 微调 RGB 值就可以改变颜色深浅。觉得某个颜色太深就加大数值(上限 255),太浅就减小。
RGB(60,60,60)在白色背景上是清晰的深炭灰;RGB(30,30,30)则近乎纯黑。
2.6 写入 PowerShell Profile
把配置写入 PowerShell 的 profile 文件,每次启动自动生效:
- 找到 profile 文件路径:
# 查看路径
echo $PROFILE
# 典型路径:C:\Users\你的用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
# 如果文件不存在,创建它
if (!(Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
# 用记事本打开编辑
notepad $PROFILE
- 添加配置:
# 在 profile 文件中加入以下内容(放在其他 Set-PSReadLineOption 之前)
Set-PSReadLineOption -Colors @{
Default = "`e[38;2;60;60;60m"
Command = "`e[38;2;180;140;20m"
Parameter = "`e[38;2;0;140;140m"
String = "`e[38;2;180;80;180m"
Number = "`e[38;2;60;120;200m"
Operator = "`e[38;2;100;100;100m"
}
- 重新加载生效:
. $PROFILE
输入 ssh root@139.155.183.138 试试——现在每个部分在白色毛玻璃背景上都清晰可读了。
3. 第二战:从 Oh My Posh 迁移到 Starship
3.1 为什么要换
Oh My Posh 和 Starship 是同一个品类的工具——Shell 提示符美化引擎。二者二选一,不能同时用(后初始化的那个会覆盖前一个)。
| Oh My Posh | Starship | |
|---|---|---|
| 主题数量 | 海量内置主题 | 一种,通过 TOML 定制 |
| 配置文件 | JSON | 单个 starship.toml |
| 速度 | Go 编译,稍慢 | Rust 编译,更快 |
| 风格 | 预设花哨、信息密集 | 默认极简,按需加模块 |
| 安装方式 | winget / scoop / brew | winget / scoop / brew / cargo / 单文件二进制 |
换 Starship 的主要理由:更快、配置更简洁、跨平台一致性更好。
3.2 安装 Starship
Windows 上推荐用 winget:
winget install Starship.Starship
验证安装:
starship --version
# starship 1.26.0
3.3 切换 Profile
打开 PowerShell profile 文件,做以下修改:
# 注释掉 Oh My Posh(保留以备回退)
# oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/tokyonight_storm.omp.json" |
# Invoke-Expression
# 启用 Starship
Invoke-Expression (&starship init powershell)
重新打开 PowerShell 或执行 . $PROFILE,提示符就变成 Starship 了。
4. 第三战:Starship 配置与踩坑
4.1 使用 Preset 快速上手
Starship 内置了社区预设主题,一键套用:
# 列出所有可用预设
starship preset --list
# 我选了 gruvbox-rainbow(暗色暖调,信息丰富)
starship preset gruvbox-rainbow -o ~/.config/starship.toml
配置文件位置:~/.config/starship.toml
4.2 错误一:重复 Section(duplicate key ❌)
重新执行 preset 命令覆盖已有文件时会报错:
starship preset gruvbox-rainbow -o ~/.config/starship.toml
Error writing preset: Error saving file, use --force to overwrite existing configuration file
原因: Starship 防止你误操作覆盖已有的配置文件。
解决: 加 --force:
starship preset gruvbox-rainbow -o ~/.config/starship.toml --force
4.3 错误二:TOML 重复键(duplicate key ❌)
手动编辑 starship.toml 时,可能不小心让同一个 Section 出现了两次:
# 文件开头
[character]
success_symbol = '[➜](bold green)'
# ... 中间很多配置 ...
# 文件末尾又写了一次
[character]
success_symbol = '[](bold fg:color_green)'
报错信息:
[ERROR] - (starship::config): Unable to parse the config file:
TOML parse error at line 194, column 2
|
194 | [character]
| ^^^^^^^^^
duplicate key
根因: TOML 格式不允许同一个 [section] 出现两次。Starship 的每个模块([character]、[git_branch]、[nodejs] 等)在配置文件中只能定义一次。
解决: 搜一下文件,把同名 Section 合并或删掉多余的。
4.4 配置文件核心结构解读
一个典型的 Starship 配置文件长这样:
# === 全局设置 ===
"$schema" = 'https://starship.rs/config-schema.json' # 编辑器自动补全(可删)
add_newline = true # 命令之间空一行
palette = 'gruvbox_dark' # 引用下方自定义调色板
# === 自定义调色板 ===
[palettes.gruvbox_dark]
color_fg0 = '#fbf1c7'
color_blue = '#458588'
# ...
# === 提示符布局 format ===
format = """
[](color_orange)\
$os\
$username\
[](bg:color_yellow fg:color_orange)\
$directory\
# ...更多模块...
$line_break$character"""
# === 各模块配置 ===
[os] # 操作系统图标
disabled = false
[directory] # 当前目录显示
truncation_length = 3 # 路径最多显示 3 层
[git_branch] # Git 分支
symbol = ""
[character] # 提示符末尾的箭头
success_symbol = '[](bold fg:color_green)'
format 字段解读——模块之间的连接符:
[](color_orange)\ ← 圆角起始,橙色
$os\ ← OS 图标模块
$username\ ← 用户名模块
[](bg:color_yellow fg:color_orange)\ ← 三角分隔符,橙色→黄色过渡
$directory\ ← 目录模块
...
$line_break$character ← 换行 + 输入提示符
每个 [](bg:X fg:Y) 是一个 Powerline 风格的三角分隔符,bg 是分隔符自己的颜色,fg 是分隔符前面区域的颜色。这种 fg → bg 的渐变效果就是 Powerline 风格的核心。
5. 第四战:让 Git Bash 也用上 Starship
5.1 问题
PowerShell 里主题很漂亮,但一切换到 Git Bash——又是光秃秃的默认提示符。
根因: Starship 是通过 Shell 的 profile 文件初始化的。PowerShell 有 $PROFILE,Bash 有 .bashrc。需要在 Git Bash 的 .bashrc 里也加上初始化命令。
5.2 尝试创建符号链接(失败 ❌)
Starship 通过 winget 安装在:
C:\Users\你的用户名\AppData\Local\Microsoft\WinGet\Packages\
Starship.Starship_Microsoft.Winget.Source_8wekyb3d8bbwe\starship.exe
Git Bash 的 PATH 里有 WinGet\Links\ 目录(里面是其他程序的快捷方式),但没有 starhip 的链接。
尝试用 PowerShell 创建符号链接:
# ❌ 需要管理员权限
New-Item -ItemType SymbolicLink `
-Path '...\WinGet\Links\starship.exe' `
-Target '...\WinGet\Packages\...\starship.exe'
# 报错:Administrator privilege required for this operation.
为什么不走这条路: 没有管理员权限时无法创建符号链接,而且这个方案比较 hacky。
5.3 最终方案:直接加目录到 PATH ✅
在 ~/.bashrc 中添加:
# Starship prompt(与 PowerShell 共用同一份配置文件)
STARSHIP_PATH="/c/Users/你的用户名/AppData/Local/Microsoft/WinGet/Packages/Starship.Starship_Microsoft.Winget.Source_8wekyb3d8bbwe"
export PATH="$STARSHIP_PATH:$PATH"
eval "$(starship init bash)"
说明: Git Bash 中
/c/就是C:\。Starship 会自动读取~/.config/starship.toml,所以配置文件不用动。
重新打开 Git Bash 或执行 source ~/.bashrc 生效。
6. 第五战:云服务器远程部署
6.1 问题
云服务器(Linux)不能直接跑 Starship 官网的一键安装脚本:
# ❌ 服务器上 GitHub 连接不稳定,这一步会卡住
curl -sS https://starship.rs/install.sh | sh
因为脚本内部会去 GitHub Releases 下载二进制,国内服务器访问 GitHub 经常超时。
6.2 手动部署方案
思路: Starship 就是一个独立的二进制文件(约 6MB),没有依赖。在本地下载好,scp 传上去就行。
步骤 1:确认服务器 CPU 架构
ssh root@你的服务器IP "uname -m"
# 输出 x86_64 → 下载 x86_64 版本
# 输出 aarch64 → 下载 ARM 版本
步骤 2:本地下载对应版本
在浏览器打开 Starship Releases,下载文件名包含 x86_64-unknown-linux-musl 的 .tar.gz 包。
或者用 PowerShell:
# x86_64 架构
Invoke-WebRequest -Uri "https://github.com/starship/starship/releases/latest/download/starship-x86_64-unknown-linux-musl.tar.gz" `
-OutFile "$env:TEMP\starship.tar.gz"
步骤 3:上传到服务器
scp starship-x86_64-unknown-linux-musl.tar.gz root@你的服务器IP:/usr/local/bin/
步骤 4:在服务器上解压并配置
ssh root@你的服务器IP
cd /usr/local/bin
# 解压
tar -xzf starship-x86_64-unknown-linux-musl.tar.gz
# 赋权
chmod +x starship
# 清理压缩包
rm starship-x86_64-unknown-linux-musl.tar.gz
# 验证
starship --version
# 输出:starship 1.26.0
# 写入 bashrc
echo 'eval "$(starship init bash)"' >> ~/.bashrc
# 立即生效
source ~/.bashrc
如果 starship --version 报 command not found,说明 /usr/local/bin 不在 PATH 里,先执行:
export PATH=$PATH:/usr/local/bin
步骤 5:上传配置文件(与本地保持一致)
在本地 PowerShell 中执行:
scp ~/.config/starship.toml root@你的服务器IP:~/.config/starship.toml
注意: 如果服务器没有安装 Nerd Font,那些特殊图标字符(
等)会显示为乱码方块。有两个选择:
- 在服务器上也安装 Nerd Font
- 专门给服务器写一份不用特殊字符的简化配置,上传到服务器后把
starship.toml里的图标 symbol 替换为普通字符
6.3 可选:SSH 登录快捷配置
每次登录输完整 IP 很麻烦,在本地 ~/.ssh/config 中配置别名:
Host myserver
HostName xxx.xxx.xxx.xxx
User root
IdentityFile ~/.ssh/my_key # 如果有密钥的话
之后:
ssh myserver # 登录
scp file.txt myserver:/root/ # 传文件
对 ssh、scp、sftp、rsync 全部生效。
7. 最终效果
三处终端提示符风格完全一致,同时 PSReadLine 配色在白色毛玻璃背景下清晰可读。
| 环境 | Shell | 配置文件 |
|---|---|---|
| Windows Terminal | PowerShell 7 | $PROFILE + ~/.config/starship.toml |
| Windows Terminal | Git Bash | ~/.bashrc + ~/.config/starship.toml |
| SSH 远程 | Linux Bash | ~/.bashrc + ~/.config/starship.toml |
核心思路: 三个 Shell → 同一个 starship 二进制 → 同一份 starship.toml 配置文件。

8. 核心教训总结
| 遇到的问题 | 根因 | 教训 |
|---|---|---|
PSReadLine -Colors Key 报错 | Get 属性名有 Color 后缀,Set Key 没有 | 读写 API 的命名不一定对称,试错即可 |
| ConsoleColor 枚举颜色偏浅 | 终端暗色主题会重映射颜色名 | 用 RGB ANSI 转义码绕过主题映射 |
Starship TOML 报 duplicate key | 同一个 [section] 写了两次 | TOML 每个 Section 只能出现一次,搜一下合并 |
| Starship preset 提示覆盖失败 | 默认保护已有配置 | 加 --force 强制覆盖 |
| Git Bash 找不到 starship | winget 安装的二进制不在 Git Bash PATH | 手动把安装目录加到 .bashrc 的 PATH |
| 符号链接需要管理员权限 | Windows 安全策略 | 不用符号链接,改 PATH 更简单 |
| 服务器安装脚本卡住 | GitHub 网络不通 | 本地下载 → scp 上传,二进制单文件无依赖 |
本文记录了从"终端看不清命令"这个微小痛点出发,一路打通 PowerShell、Git Bash、Linux 服务器三端统一美化的全过程。核心经验只有一条:当终端主题和你的背景色不匹配时,绕过主题直接控制颜色,而不是跟主题的映射表较劲。
附录:完整配置文件参考
PowerShell Profile(点击展开)
文件路径:C:\Users\用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
# 强制 UTF-8:解决中文乱码
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding =
New-Object System.Text.UTF8Encoding
# Starship 初始化
Invoke-Expression (&starship init powershell)
# PSReadLine 语法高亮(RGB 硬编码,适配白色毛玻璃背景)
Set-PSReadLineOption -Colors @{
Default = "`e[38;2;60;60;60m"
Command = "`e[38;2;180;140;20m"
Parameter = "`e[38;2;0;140;140m"
String = "`e[38;2;180;80;180m"
Number = "`e[38;2;60;120;200m"
Operator = "`e[38;2;100;100;100m"
}
# 历史预测补全
Set-PSReadLineOption -PredictionSource History
Git Bash .bashrc(点击展开)
文件路径:C:\Users\用户名\.bashrc
# Starship prompt(与 PowerShell 共用配置文件)
STARSHIP_PATH="/c/Users/用户名/AppData/Local/Microsoft/WinGet/Packages/Starship.Starship_Microsoft.Winget.Source_8wekyb3d8bbwe"
export PATH="$STARSHIP_PATH:$PATH"
eval "$(starship init bash)"
Starship 配置文件片段(点击展开)
文件路径:~/.config/starship.toml
完整内容较长,关键结构已在 4.4 节 解读。完整文件可通过 starship preset gruvbox-rainbow 生成。