跳到主要内容

终端是如何工作的

· 阅读需 7 分钟

原文: How Terminals Work

  1. Terminal 就是一个由等大单元格组成的网格.

  2. 每个单元格只能存放一个字符加上一些样式(颜色,加粗,下划线).

  3. 转义序列(Escape Sequences): 特殊字符序列控制着 Terminal 的行为(移动光标, 改变颜色, 清空屏幕)

  4. 当你按一下个键时, 终端会向程序发送转义之后的字符序列. (终端默认不会发送鼠标事件。程序需要先请求鼠标追踪功能,之后点击操作才会转换为带坐标的转义序列)

  5. Signals(信号量): Ctrl + C 组合键不会输入字符,而是会发送一个信号. 终端会拦截特殊的组合键, 并转化为操作系统层面的事件(信号量), 用于中断或控制程序运行.

    • ctrl + c 中断 Interrupt

    • ctrl + z 暂停程序 Suspend

    • ctrl + D 文件结束 End of file

    普通按键会转换为字节流传输给程序,而信号键则被终端拦截并转换为操作系统级别的事件,用于中断或控制进程。

  6. Raw vs Cooked Mode

    • Cooked mode: 需要输入整行后按回车键 (Shell, bash, zsh, cat)
    • Raw mode: 每个按键都会直接发送给程序. (vim, htop, ssh, less)
  7. The Round Trip: 每次按键都会通过终端栈传递给程序,随后输出结果又会回流到屏幕上显示。

    1. 每按下按键
    2. 终端键按键编码成字符
    3. 将字符传输给 Shell 进程
    4. 终端将输入的字符显示出来
    5. 按下回车键(Shell 执行命令)
    6. Shell 将执行结果传输给终端
    7. 终端将结果显示出来

    1. keystore -> 2. encode -> 3. Shell -> 4. execute -> 5. output -> 5. render (repeat!)

  8. 构建复杂终端用户界面 (Building Complex TUIs)

    • htop, vim 这种高级 TUI 会将屏幕划分为多个区域.
      • 每个区域都有自己的内容, 调整大小的方式 (用字符而非像素来构建图形用户界面)
      • 以字符单元格来存储其坐标,尺寸使用制表符 (┌─┐│) 绘制可视化边框
      • 当内容发生变化时, 文本用户界面会自动重新计算这些参数.
      • 每次只会有一个区域获得焦点(focused)
      • 调整终端窗口大小时, 系统会发送 SIGWINCH 信号. TUI 会通过 ioctl() 获取新尺寸,重新计算各个区域尺寸并刷新整个屏幕显示.
      • 先在内存中完成绘制,再一次性输出全部内容。
  9. 终端有 2 套屏幕, 终端根据输入在这 2 套屏幕之间切换.

    • normal(带滚动),
    • alternate(供应用程序作画布使用) (vim, kess, man, htop, tmux 等终端应用都会启用备用屏幕)
  10. Terminal Icons, 就是特殊渲染的 Unicode 字符

  11. 状态管理

    • 在 Claude Code 按下 shift+ tab 组合键时, 终端不会记住任何状态(而是由 Claude Code 在内存中处理)
      • 状态变化时 Claude Code 会重新绘制屏幕的相关部分
      • Claude Code 会保存下面这些程序变量. 注意: 终端本身并不存储应用的状态---它仅显示你发送的字符内容
        • currentMode
        • inputBuffer
        • history
    • Claude Code 可以将状态保存到文件中.
  12. Text Selection & Cursor Positioning

    • 无法通过点击来移动光标
    • 终端本质上是一个被动的显示设备。它只在应用程序指定的位置显示字符。光标位置完全由正在运行的程序控制,终端只能通过发送按键事件来施加影响,而这些事件最终由程序来解析和处理。
  13. 终端术语表

    • 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

  14. 常见问题

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