外观
终端模拟器怎么选:Ghostty、WezTerm、kitty 与系统终端
为什么需要它
终端模拟器和 shell 是两层完全不同的东西。模拟器(系统自带「终端」、Ghostty、WezTerm、kitty、iTerm2……)负责画字符、处理键盘输入、管理窗口和标签页;shell(zsh、bash……)负责解析你敲的命令、维护 PATH、跑脚本。换一个模拟器不会改变任何命令的行为——ls、git、Homebrew 装的工具在哪个模拟器里跑结果都一样,因为这些是 shell 和系统在处理,模拟器只负责把结果画出来。真正会改变命令行为的,是换 shell(比如从 zsh 换到 fish)或者改 shell 配置文件。
很多人把两者混在一起,遇到问题就无从下手:装了个新终端,发现某个命令「行为变了」,其实往往是巧合或者环境变量差异,而不是模拟器造成的。分清这一层,才能对症排查,而不是在模拟器和 shell 配置之间来回瞎试。
开始之前
前置:终端与 Shell 基础。
本篇不要求你安装任何软件,也不修改任何 shell 配置文件。如果你跟着操作步骤装了某个候选模拟器,卸载方式是删除对应的 .app(以及你自己另外创建的配置文件),不会影响其他终端应用,也不会碰到你的 .zshrc 等文件。
操作步骤
1. 用一条命令确认分工
在你当前的终端里跑:
zsh
echo $SHELL这条命令问的是「我的登录 shell 是什么」,和你正在用哪个模拟器窗口无关。换一个模拟器再跑一遍,只要没改过默认 shell,结果应该完全一样——这就是「模拟器只管显示、shell 才管命令」最直接的证据。
2. 系统自带「终端」够用的场景
如果你只是偶尔打开跑几条命令,或者对滚动手感、渲染速度没有明确不满,macOS 自带的「终端」已经完全够用:零安装、零配置,跟着系统升级自动更新,不需要额外维护。没有明确诉求(比如想要更快的渲染、想用图形协议看图、想要跨平台统一体验)之前,不需要专门为了换终端而换终端。
3. Ghostty 的取舍
Ghostty 是原生系统界面的应用,macOS 上渲染走 Metal,目标是「快」和「原生」,配置是纯文本 key = value 格式,支持零配置直接用;它也带图形设置窗口,但完整选项仍是按配置文件的键来组织的,想全量调整还是要落回文本配置。取舍在于它要求较新的操作系统版本,而且是相对年轻的项目,插件生态不如老牌工具成熟。安装、配置文件位置、首次运行的细节参见软件页,这里不重复。
4. WezTerm 与 kitty:另外两个方向
WezTerm 和 kitty 都是开源、跨平台的终端模拟器,但取向和 Ghostty 不完全一样:
- WezTerm 用 Rust 实现,官方页面写明支持 Linux、macOS、Windows 10、FreeBSD 与 NetBSD——覆盖到 Windows 是它相对 Ghostty(仅 macOS、Linux)和 kitty(不支持 Windows)的差异点。配置用 Lua 编写,是一门完整的脚本语言,能写条件判断、注册事件回调(比如按标签页状态动态改标题),灵活度比纯
key = value高,但也意味着上手要多懂一点 Lua 语法。 - kitty 支持 Linux、macOS 和多种 BSD,不支持 Windows。配置是纯文本的
kitty.conf,按字体、滚动、鼠标、窗口布局等分节。它还定义了自己的「kitty 图形协议」,用于在终端里直接显示图片、动画,一些命令行工具(比如某些图片查看器、ranger一类的文件管理器预览)会用到这个协议画图;Ghostty 和 WezTerm 也各自支持图形协议,但协议标准不完全统一,能不能用上取决于具体工具是否适配。
如果你更看重跨平台配置一致(比如 macOS 和 Windows 机器都要用),WezTerm 的 Lua 配置可以直接复用;如果你常用依赖图形协议画图的命令行工具,kitty 是这个协议的原生实现。iTerm2 没有在这里展开,是因为它更成熟、图形化设置界面更完整,但也更重(功能面更大),取决于你更看重轻量原生还是功能全面和插件生态,两者没有绝对的对错。
5. 并行试用,不要一次性迁移
装一个候选模拟器后,不要立刻把它设成默认,也不要卸载旧的。两周内两个都留着,日常工作用哪个都行,专门用新的处理一些边缘场景(长时间运行、大量滚动输出、SSH 到别的机器)。这样即使新模拟器在某个场景下表现不如预期,退回旧的没有任何成本——因为它们都不接管 shell 配置,退回去就是关掉新窗口、继续用旧窗口。
检查结果
在候选模拟器里跑下面这四条命令,和旧终端的结果逐项比对:
zsh
echo $SHELL
echo $TERM
tput colors
infocmp | head -1下面是在本机 Ghostty 里实测的一组输出,作为你比对时的参照(不是「标准答案」,你自己机器上的具体值会不同):
text
echo $SHELL # -> /opt/homebrew/bin/zsh
echo $TERM # -> xterm-256color
tput colors # -> 256
infocmp | head -1 # -> Reconstructed via infocmp from file: /usr/share/terminfo/78/xterm-256color比对的预期:
$SHELL应该和旧终端里跑出来的完全一致——分工上模拟器不决定你用哪个 shell。tput colors通常一致,或者新模拟器更高——这个数字来自当前$TERM对应的终端描述,不是模拟器本身「能显示多少色」,所以两边不一致时先看$TERM是不是同一个值。$TERM恰恰是最可能不一致的一项——这不是故障,是下一节要处理的正常现象。
补充一点:上面这份 Ghostty 实测里,$TERM 是 xterm-256color,而不是 Ghostty 自带的 xterm-ghostty 终端信息条目(用 infocmp xterm-ghostty 能看到这个条目确实存在,是 Ghostty 自带安装的,TERMINFO 环境变量也指向了 Ghostty 自带的 terminfo 目录)。这说明当前这个 $TERM 的值更可能是运行环境(比如某些启动方式、外层工具)显式设置或沿用的,而不是 Ghostty 在普通交互窗口里的默认行为。这正是本文强调「自己动手跑一遍」而不是照抄任何人的输出的原因——同一个模拟器,在不同的启动方式下 $TERM 都可能不同。
常见问题
SSH 到远端后清屏、颜色错乱,或者提示 unknown terminal type。 本地新模拟器的 $TERM 值(比如某些模拟器默认的 xterm-ghostty、wezterm)在远端机器的 terminfo 数据库里可能没有对应条目,远端程序拿到一个不认识的 $TERM 就退化处理甚至报错。解决方向是把对应的 terminfo 条目装到远端(常见做法是用 infocmp 导出本地条目、tic 导入远端,或者直接用 TERM=xterm-256color 这类兼容值覆盖单次连接),而不是卸载新终端换回旧的——换回旧终端只是回避问题,远端 terminfo 缺失的根因还在。
图标字体显示成方框或问号。 部分终端主题、状态栏插件会用到 Nerd Font 一类打了图标字形的字体,系统默认字体没有这些字形。解决方法是安装并在模拟器配置里指定一个带图标的字体,和终端模拟器本身「支不支持」图标无关。
GUI 方式打开的应用和终端里手动敲命令,PATH 不一样。 这和换终端模拟器没有关系,根因在 shell 启动文件按场景加载不同的文件,GUI 启动的进程往往不经过登录、交互 shell 那一套加载流程。详细机制见zsh 启动文件与加载顺序。
动手练习
选一个候选模拟器装上,不改任何配置,直接当日常终端用一周。只记录三件事:
- 启动速度(从点开图标到能敲命令,凭感觉比,不用精确计时)。
- 滚动手感(翻看长输出、
less一类分页时是否顺畅)。 - 有没有哪个命令的输出或行为看起来不一样——如果有,先用「检查结果」那四条命令比对,大概率能定位到是
$TERM差异还是别的原因。
一周后再决定要不要花时间去配置它、把它设成默认。