终端环境与配置¶
一、这页讲什么¶
终端环境配好之后,从文档里复制过来的命令可以直接粘贴执行,报错信息不是乱码,关掉窗口也不会杀掉正在跑的任务。这页按「先定 Shell → 再配宿主 → 配提示符 → 会话保活」的顺序做完,最后用一份检查清单确认。
读完能做成三件事:新机器半小时内配到可用;判断一条报错是编码、换行还是 Shell 语法问题;把长任务放进会话里,断开后还能接回来。
二、开始之前¶
| 项 | 内容 |
|---|---|
| 更新日期 | 2026-10-21 |
| 适用版本 | Windows 11 + PowerShell 7.4;Ubuntu 24.04 |
| 预计耗时 | 30 分钟 |
| 风险级别 | 低。只改本机配置文件,不改系统服务 |
| 前置 | 会用 cd、ls、cat 这类基本命令;有本机管理员权限 |
三条约定:修改前先备份原文件(Copy-Item x x.bak);一次只改一项,改完验证;配置文件放在版本库里,换机器直接复用。
三、动手做¶
3.1 定默认 Shell¶
Windows 自带的是 Windows PowerShell 5.1,语法与新版有差异(管道、编码、&& 支持都不同)。统一装 PowerShell 7,并把 PowerShell 7 设为终端默认。
# 安装 PowerShell 7(用户级,不动系统自带版本)
$ winget install --id Microsoft.PowerShell -e
# 查版本,确认主版本号是 7
$ pwsh -v
PowerShell 7.6.1
看到 PowerShell 7.x 的版本号就算成。
Linux 侧不需要换 Shell,Ubuntu 默认 bash 即可,后文按 bash 写。
3.2 装 Windows 终端与字体¶
Windows 终端是承载窗口的宿主,负责渲染、分屏、标签页;Shell 跑在终端窗口里。两者分开升级,配置也分开。
$ winget install --id Microsoft.WindowsTerminal -e
Successfully installed
$ winget install --id DEVCOM.JetBrainsMonoNerdFont -e
Successfully installed
看到「已成功安装」并且开始菜单出现「终端」就算成。
字体装带 Nerd Font 的版本,提示符上的图标靠字体渲染。普通字体也能用,只是图标位置会显示成方块。
3.3 写 PowerShell 配置文件¶
$PROFILE 是每次启动自动执行的脚本路径。先看路径,再建文件,然后加别名与提示符。
$ $PROFILE
C:\Users\<用户名>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
$ if (!(Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
$ echo $PROFILE | Get-Content # 确认文件已建出来
看到路径打印出来、文件存在就算成。
配置文件里放三类内容:常用别名、提示符初始化、只在交互式终端生效的设置。
# 别名:短命令指向常用参数
Set-Alias ll Get-ChildItem
function gs { git status --short }
# 提示符(需要先装 oh-my-posh)
oh-my-posh init pwsh | Invoke-Expression
改完重开一个终端窗口,ll 能列出目录就算成。
3.4 Linux 侧:别名与提示符¶
bash 的对应文件是 ~/.bashrc,fish 是 ~/.config/fish/config.fish。两边的语法不通用,别名写法一样,函数写法不同。
# 追加两条别名,先备份再改
$ cp ~/.bashrc ~/.bashrc.bak
$ echo "alias ll='ls -alF'" >> ~/.bashrc
$ source ~/.bashrc && ll
total 24
drwxr-xr-x 5 demo demo 4096 Oct 21 10:10 .
列出带权限与时间的目录内容就算成。
3.5 会话管理¶
直接开窗口跑长任务,断开连接任务就没了。tmux 让 shell 进程挂在一个会话里,断开后重连接回来。
$ tmux new -s work # 新建名为 work 的会话
$ tmux ls # 另开窗口看会话列表
work: 1 windows (created Tue Oct 21 10:12:04 2026)
$ tmux attach -t work # 接回会话
Ctrl+B 再按 D 是分离,会话继续在后台跑;tmux ls 能看到会话就算成。
四、做完怎么确认¶
| 检查项 | 期望结果 |
|---|---|
pwsh -v |
输出 PowerShell 7.x |
| 新开终端窗口 | 提示符带图标,无方块字 |
ll |
列出目录内容,不是「找不到命令」 |
tmux ls |
能看到刚才建的会话 |
断开 SSH 后重连,tmux attach -t work |
回到原会话,历史输出还在 |
五项都过,环境可用。
五、卡住了怎么排查¶
| 症状 | 多半是 | 怎么办 |
|---|---|---|
| 中文显示成方块 | 字体不含中文字形 | 换含中文的等宽字体,或单独设置 face |
| 图标显示成方块 | 字体不是 Nerd Font | 装 Nerd Font 版本 |
\r 或 bad interpreter: ^M |
文件是 CRLF 换行 | dos2unix 文件名,或 sed -i 's/\r$//' 文件名 |
| 粘贴多行命令只执行了第一行 | 终端把换行当执行 | 用 bracketed paste,或先粘到编辑器再执行 |
| 挂载目录里操作特别慢 | WSL 跨文件系统访问 | 项目文件放进 WSL 内部目录,别放 /mnt/c |
| fish 里报语法错误 | 命令按 bash 写法写 | 换 bash,或按 fish 语法改写 |
| 启动终端明显变慢 | 配置文件里执行了重活 | 把耗时命令移出 $PROFILE,按需手动跑 |
| SSH 连上后卡住不动 | 会话初始化脚本阻塞 | 先 ssh -T 测试,逐步排查 profile 内容 |
症状表覆盖不到时,先确认三件事:当前 Shell 是哪个($PSVersionTable 或 echo $SHELL)、配置文件路径对不对、报错原文是什么。报错原文比任何猜测都准。
六、为什么这样能成¶
终端里的文字走一条固定链路:宿主窗口把按键交给 Shell,Shell 执行程序,程序把输出按字节流交给宿主渲染。中文乱码是编码不一致(UTF-8 与 GBK 互认),^M 是 Windows 换行符多出来的回车,图标是字体缺字形。
ANSI 转义序列负责颜色与光标控制,宿主负责解析,所以「换个终端颜色就不对」通常是宿主没开对应的转义支持。tmux 能保活是因为 tmux 把自己做成父进程,Shell 挂在会话下,SSH 断开只杀掉终端连接,不杀会话。
七、边界与替代¶
这页只管本机终端环境。以下情况别按这页做:
- 服务器上只跑一次的命令:临时用系统自带 Shell,不必配环境。
- 团队统一镜像或受组策略管控的机器:先确认能不能改配置文件,改不动就走镜像内置方案。
- 需要图形界面的操作:终端不是合适入口,用各自的客户端。
替代方案:不想装额外字体就接受图标缺失;不需要保活就用 nohup;只是看文件差异用编辑器自带的终端,不必单独配。
八、官方资料¶
- Windows 终端文档:https://learn.microsoft.com/zh-cn/windows/terminal/
- PowerShell 配置文件说明:https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_profiles
- oh-my-posh 文档:https://ohmyposh.dev/docs/
- WSL 基本命令:https://learn.microsoft.com/zh-cn/windows/wsl/basic-commands
- tmux 手册:https://man.openbsd.org/tmux
- Cascadia Code(含 Nerd Font 替代方案说明):https://github.com/microsoft/cascadia-code