适用读者:已经能在 IDE 里写代码,但一到"连服务器"就只会复制粘贴命令的人。
前置:S01-B01。
实测环境:Ubuntu 24.04.1 LTS / tmux 3.4(本文 tmux 部分为实测);包管理器与终端 GUI 部分为文档口径。
覆盖旧文:A-1783(Homebrew,137 点)、A-1785(Chocolatey,83 点)、A-1798(Tabby,73 点)、A-1799(Warp,81 点)、A-1800(WindTerm,83 点)= 457 点。
新增扩展:E-S01-012(tmux 会话复用)、E-S01-013(zsh/fish + starship)。
上一篇:S01-B06 · IDEA 插件:安装、选型与成本
下一篇:S01-B08 · Vim 生存手册。
1. 一句话结论
终端工具解决的是"如何同时管理多个远程会话",包管理器解决的是"如何可靠地装/升/卸软件"。两件事互不相干,但都指向同一个目标:把重复劳动交给机器。
旧文花了大量篇幅比较谁"更酷炫",本篇反过来排优先级:
| 优先级 | 事项 | 为什么排这个位置 |
|---|---|---|
| 1 | ssh 免密可用(见 S01-B11) | 没有它,再漂亮的终端也只是个黑框 |
| 2 | 包管理器 | 决定你装软件是否可复现、可卸载 |
| 3 | 会话复用(tmux/screen) | 决定你断线后任务还在不在 |
| 4 | 终端 GUI 选型 | 纯体验,随时可换 |
| 5 | shell + 提示符美化 | 最后再折腾 |
换终端 GUI 是第 4 位的事。很多人从第 4 位开始,折腾两天后发现 ssh 还是要输密码——本末倒置。
2. 包管理器:三平台一张表
| 平台 | 工具 | 安装方式 | 装一个 JDK 长什么样 |
|---|---|---|---|
| macOS | Homebrew | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
brew install --cask temurin@21 |
| Windows | Chocolatey | 管理员 PowerShell:Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) |
choco install temurin21 -y |
| Ubuntu/Debian | apt | 系统自带 | sudo apt install openjdk-21-jdk |
| 通用(Linux/macOS) | sdkman/mise | 见 S01-B02 | sdk install java 21.0.5-tem |
2.1 为什么值得用包管理器(旧文没讲透的一点)
| 手动下载安装 | 包管理器 |
|---|---|
| 自己找版本、自己解压、自己配 PATH | 一条命令,PATH 由工具处理 |
| 升级靠重新下载,容易残留旧版本 | brew upgrade / choco upgrade 统一处理 |
| 卸载常留残(注册表、目录、软链) | brew uninstall --zap / choco uninstall |
| 依赖关系靠人脑 | 工具管依赖 |
一句判据:能不能"一键重装"。装环境的能力,本质上是"可重建"的能力——这条在 S01-B09(环境重置与迁移)和 S01-A01(团队 Onboarding)里还会反复出现。
2.2 Homebrew 的三个必知前提
- 需要 Xcode 命令行工具:
xcode-select --install。没有它会卡在编译阶段。 - Apple Silicon 的安装前缀是
/opt/homebrew(Intel 是/usr/local)。装完必须把eval "$(/opt/homebrew/bin/brew shellenv)"写进~/.zprofile,否则brew命令找不到。 brew doctor是唯一的体检入口:路径冲突、权限问题、重复安装都能查出来。
旧文 A-1783 的真正价值不在"brew 有多好",而在它记录了一个真实故障:brew 环境没配好导致 brew install mongodb 失败。这类故障的修法就是第 2、3 条。
2.3 Chocolatey 的前提
- 必须管理员权限的 PowerShell(不是 CMD)。
- 安装脚本会改
ExecutionPolicy,公司安全策略可能拦截——这是它在企业环境最常见的失败点。 choco install <pkg> -y的-y别省,否则脚本会卡在交互确认上(自动化场景直接失败)。
3. 终端工具横评:先看它认不认你的 ssh 配置
旧文三篇分别推荐 Tabby、Warp、WindTerm。这里按能力而不是"惊艳程度"重排:
| 能力 | Tabby | Warp | WindTerm | Windows Terminal | iTerm2 |
|---|---|---|---|---|---|
| 跨平台 | ✅ 三平台 | macOS/Linux/Windows(较新) | ✅ 三平台 | ❌ 仅 Windows | ❌ 仅 macOS |
| 内置分屏 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 内置 SFTP/文件传输 | ✅ | ❌ | ✅ | ❌ | ❌ |
读取 ~/.ssh/config |
✅ | ✅ | ✅ | ✅(走系统 ssh) | ✅ |
| 账号/登录要求 | 无 | 有(待核:免费额度需登录) | 无 | 无 | 无 |
| 许可 | 开源 | 免费+订阅 | 开源免费(商用亦可) | 免费 | 免费 |
| 适合谁 | 需要 SSH+SFTP 一体 | 想要"智能补全/块输出" | 想要 SSH/SFTP/串口一体 | Windows 原生够用 | macOS 原生够用 |
最关键的一列是"读取 ~/.ssh/config"。它决定你在 S01-B11 里配好的 Host 别名能不能在终端里直接 ssh blog。不能读的终端,等于让你把配置再抄一遍。
结论:三个都能用。如果你已经按 B11 配好 ssh config,随便挑一个能读它的即可;如果你需要频繁传文件,WindTerm 或 Tabby 的 SFTP 面板省事;如果你在 Windows 且不想装第三方,Windows Terminal 完全够。
3.1 安装后的第一件事:验证 ssh 复用
# 在终端里执行;能连通就说明它读了你的 ssh 配置
ssh -G blog | head -5 # 打印实际生效的配置(不会真连接)
ssh blog 'echo ok' # 真连接(前提:B11 已配好 Host 别名)
ssh -G 是排障神器:它只解析配置、不发起连接,能立刻看出 HostName/Port/IdentityFile 是否按你预期解析。
4. tmux:真正的"断线不丢任务"(实测)
换终端 GUI 只是换壳。真正解决"网络断了任务还在跑"的是 tmux(或 screen)。
4.1 实测:会话在后台持续写日志
# 起一个脱离终端的会话,让它每秒写一行日志
tmux new-session -d -s job \
'for i in 1 2 3 4 5; do echo "line$i $(date +%T)" >> /tmp/tmuxdemo.log; sleep 1; done'
sleep 1.5
tmux ls # 会话存在,而我此刻并没有 attach
cat /tmp/tmuxdemo.log
实测输出:
job: 1 windows (created Thu Nov 5 15:57:31 2026)
line1 15:57:31
line2 15:57:32
关键点:我"没有连接"这个会话,日志照样在写。这就是 tmux 的全部意义——任务进程挂在 tmux server 上,而不是挂在你这个 SSH 客户端上。
4.2 日常五条命令(够用一辈子)
| 命令 | 作用 |
|---|---|
tmux new -s work |
新建会话 |
tmux ls |
列出会话 |
tmux attach -t work |
重新接上(断线后回来第一件事) |
Ctrl+b 然后 d |
脱离(detach),进程继续跑 |
tmux kill-session -t work |
关掉会话(注意:里面的进程会被终止) |
分屏:Ctrl+b 然后 %(左右)、"(上下);切换 Ctrl+b 加方向键。
踩坑:在 tmux 里跑需要长连接的交互式命令(如
npm run dev)时,别忘了Ctrl+b d是脱离而不是关闭;关闭窗口(Ctrl+b &)会连带杀进程。
5. shell 与提示符:最后再折腾
| 项 | 是什么 | 建议 |
|---|---|---|
| zsh | 默认 shell(macOS 已是) | 保持默认,配 oh-my-zsh 或最小 .zshrc |
| fish | 语法不同、开箱友好 | 适合个人机;脚本兼容性差,服务器上不建议换默认 shell |
| starship | 跨 shell 的提示符(显示 git 分支、Java 版本、耗时) | 装一个,配置一次,五秒见效 |
# 安装 starship(跨平台脚本,官方文档为准)
curl -sS https://starship.rs/install.sh | sh
# ~/.bashrc 或 ~/.zshrc 末尾
eval "$(starship init bash)" # zsh 用 starship init zsh
代价:每次敲回车多一次子进程(几十毫秒级)。在慢机器或远程 shell 上能感觉到,可关掉不需要的模块。
6. 自检清单
| # | 检查 | 命令 | 预期 |
|---|---|---|---|
| 1 | 包管理器可用 | brew -v / choco -v / apt -v |
打印版本 |
| 2 | 能装能卸 | 装一个小工具再卸掉(如 brew install jq → brew uninstall jq) |
全程无手工干预 |
| 3 | PATH 正确 | which brew / where choco |
指向 /opt/homebrew/bin 或 C:\ProgramData\chocolatey\bin |
| 4 | ssh 配置可解析 | ssh -G <alias> | head -5 |
打印出 hostname/port/identityfile |
| 5 | tmux 可脱离 | tmux new -s t → Ctrl+b d → tmux ls |
会话仍在 |
| 6 | 断线不丢任务 | 在 tmux 里跑 sleep 60,断开 SSH 再连回 tmux attach |
任务仍在跑 |
7. 旧文对照
| 旧文 | 内容 | 本篇处理 |
|---|---|---|
| A-1783 | Homebrew 介绍 + 一次真实故障(brew 未配置导致安装失败) | §2.2 提炼为三条前提;故障价值的提炼(旧文停在"水一篇"的自嘲,本篇给出修法 shellenv + brew doctor) |
| A-1785 | Chocolatey 介绍 + shell 基础命令对照(cd/ls/dir/mkdir/rm/rmdir/history/F7) | §2.3 保留前提与 -y 坑;shell 基础命令移入 B08 之前的"命令对照"提示(Windows 与 POSIX 差异) |
| A-1798 | Tabby 推荐(起因是 Xshell 收费 + 无 macOS 版) | §3 只保留能力项;把"为什么换"归纳为"跨平台 + SFTP 一体" |
| A-1799 | Warp 推荐(融资、智能特性) | §3 保留;标注"需账号/订阅(待核)"这一选型硬约束 |
| A-1800 | WindTerm 推荐(开源、性能对比、串口) | §3 保留;补"串口支持"这一独特能力(IoT/嵌入式场景) |
| — | 三篇都没有"ssh config 复用"这条判据 | 新增 §3 关键列与 §3.1 验证法(ssh -G) |
| — | 没有会话复用 | 新增 §4 tmux(实测) |
| — | 没有 shell/提示符 | 新增 §5 starship |
8. 自测
- 为什么把"终端 GUI 选型"排在第 4 位,而不是第 1 位?
- Apple Silicon 上
brew: command not found,最可能缺哪一行配置? ssh -G <alias>与ssh <alias>的区别是什么?排障时为什么先用前者?- tmux 里
Ctrl+b d与Ctrl+b &有什么本质区别? - 公司安全策略禁止改 PowerShell
ExecutionPolicy,Chocolatey 还能怎么用?(提示:离线包/内部源)
9. 下一篇
S01-B08 · Vim 生存手册:17 个高频动作
终端里迟早会遇到 vi——改个配置、看个日志、在容器里没有别的编辑器。旧文为 Vim 写了 17 篇"超详细"短文,下一篇把它们压成一张"最小动作卡":能进、能改、能存、能出、能撤销,并给出误操作的恢复路径。
本篇属于系列《S01 · 开发环境与工具链》。旧文来源:A-1783/1785/1798/1799/1800;扩展点 E-S01-012/013。tmux 部分为 2026-11-05 实测。