Files
sanbuphy 07d82d046b feat(docs): restructure appendix content into organized directories
- Move standalone AI-related files into 8-artificial-intelligence directory
- Move development tools content into 2-development-tools directory
- Move server/backend content into 4-server-and-backend directory
- Create new index files for each section
- Update .gitignore to exclude old backup directories
- Update theme imports for new component locations
2026-02-15 01:57:52 +08:00

285 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 命令行与 Shell 脚本
> 💡 **学习指南**:本章节旨在为零基础读者提供一个关于终端(Terminal)工作原理的系统性认知。无需具备计算机专业背景,我们将通过交互式演示,由浅入深地解析终端的运行机制。
## 0. 快速上手:如何打开终端?
在你开始学习之前,首先得找到它。终端是每个操作系统的“出厂标配”,你不需要安装任何软件就能使用它。
::: info 🖥️ 不同系统的打开方式
** macOS (苹果电脑)**
1. 按下 `Command (⌘) + Space` 打开聚焦搜索(Spotlight)。
2. 输入 `Terminal``终端`
3. 按回车键,你就会看到一个白底黑字(或黑底白字)的窗口。
**🪟 Windows**
- **方法一 (CMD)**:按下 `Win + R`,输入 `cmd`,按回车。这是最古老的命令行。
- **方法二 (PowerShell)**:按下 `Win + R`,输入 `powershell`,按回车。这是更现代、功能更强大的终端。
- _建议:日常简单操作两者皆可,开发环境推荐使用 PowerShell 或安装 WSL (Windows Subsystem for Linux)。_
**🐧 Linux**
- 通常快捷键是 `Ctrl + Alt + T`
- 或者在应用菜单中搜索 `Terminal`
:::
### 0.1 实操演练:先玩玩看 (Hands-on Lab)
光说不练假把式。在你了解枯燥的原理之前,我们先亲手体验一下“敲命令”的感觉。
> 💡 **提示**:为了安全和方便,推荐你在下方的**网页模拟器**中操作。如果你有信心,也可以按照第 0 章的方法打开你电脑上真实的终端,跟随步骤一起练习(效果是一样的)。
在这个练习中,你将学会:
1. **查看文件**:学会用 `ls``dir` 看看当前目录下有什么。
2. **创建与进入**:学会用 `mkdir` 创建新文件夹,用 `cd` 像传送门一样进入它。
3. **新建文件**:学会用命令快速创建一个新文件。
4. **安装软件**:体验一行代码安装 Python 库或系统软件的快感。
5. **删除清理**:学会如何删除不需要的文件(慎用!)。
6. **求助 AI**:这是最重要的!当你忘记命令时,学会问 AI:“在 Mac 上怎么删除文件?”,它会直接告诉你答案。
_请在下方选择你常用的操作系统,然后跟随引导开始操作:_
<TerminalHandsOn />
### 0.2 为什么要放弃鼠标?(Why CLI?)
你可能会问:_“现在的图形界面(GUI)这么好用,鼠标点点就行,为什么还要对着黑底白字的窗口敲复杂的命令?”_
这并非为了“装极客”,而是因为在特定场景下,**语言(命令)比手势(鼠标)更强大**。
#### 1. 鼠标难以表达“批量”与“逻辑”
- **GUI (鼠标)**:适合“看见什么点什么”。如果你想删除一张照片,右键删除很快。但如果你想“删除所有 2023 年拍摄的、大小超过 5MB 的、格式为 PNG 的照片”,鼠标就无能为力了,你可能需要手动筛选半天。
- **CLI (命令)**:适合“描述你想做什么”。上述需求只需要一行命令,计算机会自动帮你找出符合条件的文件并处理,哪怕有 10000 张。
#### 2. 命令可以被记录和复用
- **GUI**:你配置一次环境,需要点击几十次菜单。下次换台电脑,你还得凭记忆重新点一遍,很容易漏掉步骤。
- **CLI**:你可以把所有命令写进一个文件(脚本)。下次只需要运行这个文件,计算机会**零误差**地重现你的操作。这就是“自动化”的基础。
#### 3. 远程控制的唯一选择
- **GUI**:传输画面就像看高清视频,需要极高的网速。如果网稍微卡一点,鼠标就会卡顿,根本没法操作。
- **CLI**:传输的只是纯文本,几十个字符。哪怕你在信号极差的山区,也能流畅地控制远在地球另一端的数据中心服务器。
**总结**:GUI 适合**探索**(浏览网页、看图),CLI 适合**生产**(开发、运维、批处理)。作为开发者,我们用终端是因为它**更精确、更可控、更高效**。
## 1. 概念界定:终端是什么? (Definition)
_不同操作系统下的终端长相不同,**命令方式也不同**。点击下方按钮切换查看,注意观察 macOS, Windows 和 Linux 是如何用不同的命令(如 `dir` vs `ls`)做同一件事的:_
<TerminalOSDemo />
在图形用户界面(GUI)普及之前,终端是人类与计算机交互的主要方式。即便在今天,它依然是开发者控制计算机最精确、最高效的工具。
<TerminalDefinition />
本质上,终端是一个**字符流输入/输出环境**:
- **输入**:通过键盘发送指令(字符信号)。
- **输出**:通过屏幕网格显示文本反馈。
它不处理复杂的图形、图片或视频,而是专注于**文本信息的交互**。
## 2. 核心架构:解耦的艺术 (The Big Picture)
在深入了解之前,请先思考一个问题:**终端窗口自己真的懂你在说什么吗?**
其实,终端(Terminal)就像是一个**只会传话的显示器**。当你输入 `date` 命令时,终端并不知道这是“查看日期”的意思,它只是把这 4 个字母打包发给了幕后的真正大佬——**Shell**。
Shell 才是那个能听懂你说话、并指挥计算机干活的“大脑”。
为了搞清楚它们是如何配合的,我们来看这三个分工明确的“打工人”。要理解它们的关系,最好的比喻是**浏览器**与**网站服务器**。
### 2.1 角色分工
- **🖥️ 终端 (Terminal) —— 就像“浏览器”**
- **职责**:它只负责**输入**(把你的按键告诉对方)和**显示**(把对方传回来的字符画在屏幕上)。
- **特点**:它本身**没有任何智能**,也不懂什么叫 `ls``cd`。它就像 Chrome 浏览器,不管你访问的是百度还是谷歌,它只管渲染网页。
- _常见的终端_Windows 的 CMD/PowerShell 窗口, macOS 的 Terminal.app, VS Code 内置的终端。
- **🧠 Shell (壳) —— 就像“网站服务器”**
- **职责**:它才是有逻辑的大脑。它运行在后台,负责**接收**你发来的命令字符串,**解析**它的含义,然后**指挥**操作系统干活。
- **特点**:它看不见摸不着,只能通过文本流与外界交流。
- _常见的 Shell_Bash, Zsh, Fish, PowerShell。
- **⚙️ 内核 (Kernel) —— 幕后的“大管家”**
- **职责**:操作系统的核心,只有它能直接控制硬件(读写硬盘、分配内存、控制 CPU)。
- **关系**:Shell 是内核的“秘书”,帮你把人话翻译给内核听。
### 2.2 为什么分开?(可替换性)
正因为**显示层**(终端)和**逻辑层**(Shell)是完全分开的,所以它们可以自由搭配:
- **换个“皮肤”**:你可以在 macOS 上用自带的 Terminal,也可以下载 iTerm2,或者用 VS Code 的终端。它们长相不同,但连的都是同一个 Shell (zsh),所以命令一模一样。
- **换个“大脑”**:你可以在同一个终端窗口里,从 bash 切换到 zsh,或者切换到 python 交互环境。这时,终端没变,但处理命令的逻辑变了。
### 2.3 交互流程:消失的按键
你可能认为:_“我在键盘上按个 'a',终端就在屏幕上画个 'a'。”_
**错!** 真实的流程是这样的(这叫**回显 Echo**):
1. **按下 'a'**:键盘信号传给终端。
2. **发送信号**:终端把 'a' 的编码发给 Shell。
3. **Shell 处理**Shell 收到 'a',觉得没问题,于是原样把 'a' 发回给终端。
4. **显示字符**:终端收到 Shell 发回来的 'a',这才把它画在屏幕上。
> 💡 **小实验**:有些命令(如输入密码时)会关闭 Shell 的回显功能。这时你按键盘,终端发给了 Shell,但 Shell **不发回**任何东西,所以屏幕上一片空白。这就是为了保护隐私。
**一句话总结流程**
你在终端打字 ➡️ 信号传给 Shell ➡️ Shell 原样发回(你看到了字)并理解 ➡️ Shell 指挥内核干活。
_下面的演示展示了这个过程,注意看 Shell 和内核之间那道“墙”,以及字符是如何一来一回的:_
<ArchitectureDemo />
## 3. 视觉模型:网格系统 (The Grid System)
与现代图形界面使用“像素”不同,终端的显示基础是**字符网格(Character Grid**。
终端屏幕被划分为若干行和列,每一个格子称为一个**单元格(Cell)**。
### 3.1 单元格的构成
每个单元格是终端显示的最小单位,它包含两类核心信息:
1. **字符 (Glyph)**:实际显示的文字(如 `A`, `中`, `$`)。
2. **属性 (Attributes)**:字符的样式(如前景色、背景色、加粗、下划线)。
当你拖动终端窗口改变大小时,本质上是在改变这个网格的**行数 (Rows)** 和 **列数 (Columns)**
_请在下方交互区域尝试操作,观察网格如何承载字符:_
<TerminalGrid />
### 3.2 样式检查
终端无法显示图片,所有的“界面”都是通过字符颜色和样式的组合来实现的。
_点击下方单元格,查看每个格子背后包含的样式属性:_
<CellInspector />
## 4. 通信协议:转义序列 (Escape Sequences)
你可能会疑惑:既然终端只传输文本,那彩色的文字、移动的光标、清屏操作是如何实现的?
答案是**转义序列 (Escape Sequences)**。
这是一串特殊的字符指令(通常以 `ESC` 字符开头)。当终端接收到这些字符时,**不会将它们显示在屏幕上**,而是将其解释为**控制指令**。
例如:
- 普通字符 `A` → 在屏幕上画出 A。
- 序列 `\033[31m`**指令**:将后续文字颜色设为红色。
- 序列 `\033[2J`**指令**:清空屏幕。
这就好比你和朋友约定:如果我正常说话,你就记录下来;如果我举起左手(相当于 `ESC`),接下来的那句话就是命令而不是内容。
_点击下方的“播放”按钮,观察终端是如何逐个处理字符流,并识别出隐藏的指令:_
<EscapeParserDemo />
_下方组件则展示了更多种类的转义序列及其渲染效果:_
<EscapeSequences />
## 5. 输入机制:字节流 (Input as Byte Stream)
输入过程往往被误解。当你按下键盘时,终端并没有直接把字符“画”在屏幕上,而是进行了一次**编码传输**。
1. **按键捕获**:终端捕获你的物理按键动作。
2. **编码转换**:将按键转换为特定的**字节序列**。
- 按下 `a` → 发送字节 `a`
- 按下 `向上箭头` → 发送序列 `^[[A`
3. **发送**:将字节流发送给 Shell 或当前运行的程序。
**关键点**:所有的按键(包括功能键、鼠标点击)在传输层面上都是**字节数据**。
_在下方尝试按键,观察你的输入是如何被转换为底层数据的:_
<InputVisualizer />
## 6. 运行模式:打字机 vs 游戏机 (Cooked vs. Raw Mode)
终端有两种截然不同的性格。理解这一点,你就能明白为什么在终端里**打命令**和**玩贪吃蛇**是完全不同的体验。
- **加工模式 (Cooked Mode) —— 像打字机**
- 这是默认模式。
- **行为**:你输入的字符会被终端**暂时扣留**,直到你按下回车键(Enter)。
- **好处**:这给了你修改的机会。打错了?按退格键(Backspace)删掉重写,程序根本不知道你之前打错过。
- _适用场景:平时敲命令(如 `ls`, `cd`)。_
- **原始模式 (Raw Mode) —— 像游戏手柄**
- 这是“高手”模式。
- **行为**:你按下的每一个键(包括方向键、Ctrl组合键),都会**瞬间**发送给程序,没有任何缓冲。
- **好处**:程序能实时响应你的操作。
- _适用场景:玩终端游戏(如贪吃蛇)、使用 Vim 编辑器(一种纯键盘操作的编辑器)。_
_点击下方按钮切换模式,体验“写信”与“打游戏”的不同手感:_
<CookedRawDemo />
## 7. 进程控制:信号 (Signals)
在终端中按下 `Ctrl+C` 通常能停止程序。这并非通过发送字符实现,而是触发了**信号 (Signal)**。
信号是操作系统级别的通知机制,用于告诉程序发生了特定事件。
- **Ctrl+C** → 发送 `SIGINT` (Interrupt):通知程序“请中断当前操作”。
- **Ctrl+Z** → 发送 `SIGTSTP` (Suspend):通知程序“请暂停并挂起到后台”。
这一机制绕过了标准的数据输入通道,确保在程序卡死时用户仍有控制权。
<SignalsDemo />
## 8. 高级应用:全屏界面与缓冲区 (Buffers & TUI)
你有没有发现,当你用 `vim` 编辑文件或者用 `htop` 看系统状态时,它们会占满整个屏幕?而当你退出它们时,屏幕瞬间变回了原来的样子,之前的命令记录完全没变。
这是因为终端有两块“画布”在来回切换:
- **主缓冲区 (Primary Buffer)**:就像**草稿本**。
- 你写一行,系统回一行。
- 写满了就翻页(滚动),以前写的东西都在上面。
- _用于:日常敲命令。_
- **备用缓冲区 (Alternate Buffer)**:就像**黑板**。
- 程序把黑板擦干净,在上面画画(全屏显示)。
- 不管怎么画,都不会影响你桌子上的草稿本。
- 当你退出程序时,就像把黑板收起来,你又回到了草稿本面前。
- _用于:Vim, Nano, 游戏等全屏软件。_
_点击下方按钮,体验“草稿本”和“黑板”是如何瞬间切换的:_
<BufferSwitchDemo />
---
## 9. 总结 (Summary)
终端并非神秘的黑盒,它是一个标准化的文本交互接口。
- **显示**:基于网格和字符。
- **控制**:基于转义序列。
- **交互**:基于输入输出流和信号。
通过理解这些底层原理,你不再只是死记硬背命令,而是能真正理解每一次敲击键盘背后发生的逻辑流转。
## 附录:常用术语表 (Vocabulary)
| 术语 | 英文 | 解释 |
| :---------------- | :--------------------- | :------------------------------------------------- |
| **终端** | Terminal | 负责显示和输入的窗口程序(前端)。 |
| **Shell** | Shell | 负责解析命令和执行逻辑的程序(后端)。 |
| **CLI** | Command Line Interface | 命令行界面,一种基于文本的交互方式。 |
| **TUI** | Text User Interface | 文本用户界面,指在终端中通过字符构建的伪图形界面。 |
| **转义序列** | Escape Sequence | 用于控制终端光标、颜色等的特殊字符指令。 |
| **标准输入/输出** | Stdin/Stdout | 程序接收数据和输出数据的标准通道。 |
## 参考资料 (Reference)
- [How Terminals Work](https://how-terminals-work.vercel.app/):本文的结构与演示灵感深受该项目的启发。如果你希望深入了解工程实现细节,强烈推荐阅读原版教程。