终端是如何工作的
· 阅读需 7 分钟
-
Terminal就是一个由等大单元格组成的网格. -
每个单元格只能存放一个字符加上一些样式(颜色,加粗,下划线).
-
转义序列(
Escape Sequences): 特殊字符序列控制着 Terminal 的行为(移动光标, 改变颜色, 清空屏幕) -
当你按一下个键时, 终端会向程序发送转义之后的字符序列. (终端默认不会发送鼠标事件。程序需要先请求鼠标追踪功能,之后点击操作才会转换为带坐标的转义序列)
-
Signals(信号量):Ctrl + C组合键不会输入字符,而是会发送一个信号. 终端会拦截特殊的组合键, 并 转化为操作系统层面的事件(信号量), 用于中断或控制程序运行.-
ctrl + c中断 Interrupt -
ctrl + z暂停程序 Suspend -
ctrl + D文件结束 End of file
普通按键会转换为字节流传输给程序,而信号键则被终端拦截并转换为操作系统级别的事件,用于中断或控制进程。
-
-
Raw vs Cooked Mode
- Cooked mode: 需要输入整行后按回车键 (Shell, bash, zsh, cat)
- Raw mode: 每个按键都会直接发送给程序. (vim, htop, ssh, less)
-
The Round Trip: 每次按键都会通过终端栈传递给程序,随后输出结果又会回流到屏幕上显示。
- 每按下按键
- 终端键按键编码成字符
- 将字符传输给 Shell 进程
- 终端将输入的字符显示出来
- 按下回车键(Shell 执行命令)
- Shell 将执行结果传输给终端
- 终端将结果显示出来
1. keystore->2. encode->3. Shell->4. execute->5. output->5. render(repeat!) -
构建复杂终端用户界面 (Building Complex TUIs)
- htop, vim 这种高级 TUI 会将屏幕划分为多个区域.
- 每个区域都有自己的内容, 调整大小的方式 (用字符而非像素来构建图形用户界面)
- 以字符单元格来存储其坐标,尺寸使用制表符 (
┌─┐│) 绘制可视化边框 - 当内容发生变化时, 文本用户界面会自动重新计算这些参数.
- 每次只会有一个区域获得焦点(
focused) - 调整终端窗口大小时, 系统会发送
SIGWINCH信号. TUI 会通过ioctl()获取新尺寸,重新计算各个区域尺寸并刷新整个屏幕显示. - 先在内存中完成绘制,再一次性输出全部内容。
- htop, vim 这种高级 TUI 会将屏幕划分为多个区域.
-
终端有 2 套屏幕, 终端根据输入在这 2 套屏幕之间切换.
- normal(带滚动),
- alternate(供应用程序作画布使用) (vim, kess, man, htop, tmux 等终端应用都会启用备用屏幕)
-
Terminal Icons, 就是特殊渲染的 Unicode 字符
-
状态管理
- 在 Claude Code 按下 shift+ tab 组合键时, 终端不会记住任何状态(而是由 Claude Code 在内存中处理)
- 状态变化时 Claude Code 会重新绘制屏幕的相关部分
- Claude Code 会保存下面这些程序变量. 注意: 终端本身并不存储应用的状态---它仅显示你发送的字符内容
- currentMode
- inputBuffer
- history
- Claude Code 可以将状态保存到文件中.
- 在 Claude Code 按下 shift+ tab 组合键时, 终端不会记住任何状态(而是由 Claude Code 在内存中处理)
-
Text Selection & Cursor Positioning
- 无法通过点击来移动光标
- 终端本质上是一个被动的显示设备。它只在应用程序指定的位置显示字符。光标位置完全由正在运行的程序控制,终端只能通过发送按键事件来施加影响,而这些事件最终由程序来解析和处理。
-
终端术语表
- Terminal: 终端, 最早终端指的是连接计算机的带屏幕和键盘的物理设备. 现在说终端一般都是指终端模拟器.
- Terminal Emulator: 终端模拟器
- iTerm2
- windows Terminal
- kitty
- Shell: 一个解释命令的程序。Shell 负责读取你输入的内容、执行程序,并处理诸如管道、重定向和脚本编写等任务。Terminal 只是那个窗口;Shell 才是运行在其中的程序。
- sh
- bash
- zsh
- fish
- ksh
- tsch
- nushell
- bash: 大多数 linux 操作系统默认的 Shell
- console
- CLI
- git
- npm
- docker
- curl

-
常见问题
- 终端设置与 Shell 配置的区别?
- 终端设置是软件方面的, 只能修改终端界面的显示, 如字体, 颜色, 大小
- Shell 配置是需要到服务器上修改文件的.
- 通过上下箭头调出之前的命令是 Shell 程序.
- 为什么修改 .zshrc 要重启终端?
- 因为 .zshrc 是 Shell 的配置文件. 已运行的 Shell 仅在启动时读取一次 .zshrc 文件.
- 通过执行
source ~/.zshrc让 Shell 重新加载配置
- 通过
echo $SHELL查看使用的是哪个 Shell - 通过
chsh -s /bin/zsh切换 Shell - 通过
cat /etc/shells查看支持的 Shell 列表
- 终端设置与 Shell 配置的区别?