终端的完整栈解释
这篇文章涵盖了完整的栈: 从让人困惑的词汇,一直到从零开始构建 TUI(文本用户界面)应用。如果你曾经好奇 vim 实际上在做什么,为什么存在原始模式,或者 ANSI 转义序列是什么,这篇文章就是你要找的。它们以前是同一件事 # 这是关键的见解。所有四个词最初都描述同一个物理对象。在1960年代,你通过坐在一台配有键盘和打印机的机器前与计算机进行交互。根据说话的人,这台机器有三个名字: ┌───────────────────────────────────── │ ┌─────────────────────────────── │ │ $ hello world_ │ <-- "控制台"(物理设备) │ │ │ <-- "终端"(电线的尽头) │ │ │ <-- "TTY"(它是电传打字机) │ └─────────────────────────────── │ ┌─────────────────────────────── │ │ ┌───┐┌───┐┌───┐┌───┐┌───┐ │ │ │ Q ││ W ││ E ││ R ││ T │... │ │ └───┘└───┘└───┘└───┘└───┘ │ └─────────────────────────────── └───────────────────────────────────── │ │ 电线 │ ┌───────┴──────── │ 主机 │ 计算机 └──────────────── 三个名字,一个东西。这就是为什么它们会混在一起。随着硬件演变成软件,每个词逐渐 drift toward 它自己的意义。但它们的漂移是缓慢的。第一部分:词汇 # 控制台 # 控制台是计算机的物理输入/输出设备。最初它指的是直接连接到机器本身的键盘和显示器。从操作系统的角度来看,它被视为“系统的主要标准 I/O 终端。”在服务器上,当你走过来插入显示器时,你看到的就是它。在你的笔记本电脑上,如果图形桌面崩溃,你将落在的文本屏幕就是它。这是最后的终端,内核写入 panic 消息的地方,因为当其他一切都坏了时,它是保证存在的。远程访问(非控制台):你 --> 笔记本电脑 --> SSH --> 互联网 --> 服务器 │ ┌────┴──── │ 服务器 └────┬──── │ 控制台访问(真实的情况): │ 你 --> 键盘 ──────────────────────> 显示器 <────────────────────── ^ 这就是控制台。直接。物理的。即使网络中断也能工作。随着时间的推移,这个词变得更加宽松。浏览器开发工具被称为“控制台”。macOS 有一个叫控制台的日志查看器。但原始含义始终是相同的:直接、本地、硬件接口。 终端 # 终端是你看到的东西。它处理输入和输出。按键输入,文本输出。这就是它的全部工作。当你打开 iTerm2、Alacritty、Windows Terminal 或 GNOME Terminal 时,你在运行一个终端仿真器:一个在软件中完成旧硬件终端所做的电路工作程序。“仿真器”部分通常被省略,但值得记住,因为它澄清了抽象。你的终端应用程序假装是一个设备。这里是让人惊讶的部分:终端并不理解你的命令。它不知道 ls 或 git push 意思是什么。它不解析任何东西。它是一个附有键盘的显示表面。 ┌─ 终端(你看到的) ─────────────── │ │ 拥有:│ - 在屏幕上渲染文本 │ - 颜色和字体 │ - 滚动历史 │ - 复制粘贴 │ - 解释 ANSI 转义序列 │ │ 不拥有:│ - 理解命令 │ - 运行程序 │ - 选项卡补全 │ - 你的提示 │ └───────────────────────────────────────── 主要平台的终端仿真器:macOS: Terminal.app, iTerm2, Ghostty, Alacritty, kitty Linux: GNOME Terminal, Konsole Windows: Windows Terminal, ConEmu Web/Node: xterm 这是一个干净的分离,干净的分离是值得注意的。它们往往是承重的。Shell # Shell 是在你的终端中运行的程序。它是命令行解释器,它会接收你输入的文本,确定要运行的程序,运行它,并管理该进程的生命周期。你输入 git status 。你的终端将文本发送到 shell。Shell 解析它,找到 git 程序,生成进程,并连接 I/O。输出通过终端流回你眼前。Shell 处理逻辑。终端处理像素。你输入: git status │ ▼ ┌─ 终端 ─────────────────────── │ │ 将按键转换为字节 │ 发送文本到 shell │ └──────────────┬─────────────────── │ "git status\n" ▼ ┌─ Shell(bash, zsh, fish) ──────── │ │ 解析命令 │ 找到 /usr/bin/git │ 生成进程 │ 管理其生命周期 │ └──────────────┬─────────────────── │ 输出字节 ▼ ┌─ 终端 ─────────────────────── │ │ 接收输出 │ 在你的屏幕上渲染它 │ │ 当前分支 main │ 没有要提交的内容 │ └────────────────────────────────── Shell 的主要工作是:命令解析(令牌分割、重定向处理)、环境变量管理、过程启动和控制(作业控制),以及提供脚本功能。有很多 shells,使用哪个是一个有意义的选择。Bash 是默认的,几乎存在于任何类 Unix 系统中。Zsh 是 macOS 的默认值,并且在 i
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡