shell 基础:Unix / Linux / GNU / POSIX 一次讲清楚
如何理解 Unix
Unix 是 1969 年在贝尔实验室诞生的一款操作系统,由肯·汤普森和丹尼斯·里奇等人用汇编语言写出,后来用 C 语言重写。它开创了一套影响至今的设计哲学和工程实践。
三个核心特点
- 一切皆文件:在 Unix 里,普通文件、目录、键盘、鼠标、硬盘、进程间通信,甚至网络连接,都被抽象为文件。你可以用同一套系统调用(
open、read、write、close)去操作它们。这使得程序接口极度统一和简洁。 - 小而美的工具组合:Unix 提倡"做好一件事"的设计原则。每个命令行工具只专注一个功能(比如
grep搜索文本、sort排序、wc统计),然后通过管道(|)将它们串联起来完成复杂的任务。这种模块化思想深刻影响了后续软件开发。 - C 语言与可移植性:Unix 用 C 语言重写后,只需要少量汇编适配硬件,就能把整个系统移植到不同机器上。这在当时是革命性的,让操作系统不再与特定硬件绑定。
后来
商业 Unix(Solaris、AIX、HP-UX)和学术 Unix(BSD)继承了原始血脉。
POSIX 标准(可移植操作系统接口)把 Unix 的 API 和命令行行为写成了规范。任何一个遵守 POSIX 的操作系统,都可以称为"类 Unix(Unix-like)"。
类 Unix 内核 指的是:该内核一行 Unix 原始代码都没有用,但在接口和行为上对齐了 Unix 的思想与标准。
GNU 又是?
GNU 是 "GNU's Not Unix" 的递归缩写。它是理查德·斯托曼于 1983 年发起的一个项目,目标是从头编写一个完全自由、兼容 Unix 的完整操作系统。
Why
Unix 源码闭源,Richard 期望做一个开源的操作系统。
GNU 的产出
- 编译器工具链:GCC(GNU Compiler Collection)
- 核心工具集:coreutils(包含
ls、cp、mv、cat等基本命令) - Shell:Bash(Bourne Again Shell)
- C 库:glibc,为程序提供系统调用封装
- 编辑器:Emacs 等
内核部分(Hurd)进展缓慢——GNU 始终缺一个能用的内核。
Linux?
Linux 是一个开源的、类 Unix 的操作系统内核,遵循 POSIX 标准,由 Linus(git 也是 Linus 的作品)于 1991 年创建。现在通常指基于该内核,搭配 GNU 等自由软件所构成的完整操作系统发行版(如 Ubuntu、CentOS 等)。
- GNU 有完备的用户态程序,但缺少内核
- Linux 只是内核,缺少用户态程序
- Ubuntu 是 Linux 的发行版本,最常用实用
历史线
Unix (1969)
├── 哲学与接口标准 (POSIX)
│
├── GNU 项目 (1983)
│ └── 产出了 Bash, GCC, glibc, coreutils 等(自由软件,缺内核)
│
└── Linux 内核 (1991)
└── 类 Unix 内核,完全自由,正好填补 GNU 空缺
│
▼
GNU/Linux 完整操作系统(我们日常说的 Linux 发行版)什么是 Shell?
Shell 是操作系统中的一个程序,能读懂命令,工作流程是:读取命令 → 解析命令 → 寻找可执行文件 → 让内核去运行 → 显示结果。
Bash(Linux 常用)、PowerShell 和 cmd(Windows 常用)、zsh(macOS 常用)、fish 都属于 shell。
终端
- 物理终端:早期计算机中带键盘的显示器,敲键盘字符就能输入到屏幕上
- 虚拟终端:现代的终端模拟器,比如 Windows Terminal、iTerm2,用软件模拟物理终端,在图形界面中存在一个可以输入命令的窗口
终端本身不懂命令。
命令行(CLI) 是一种用户界面形态,与 GUI 相对应。终端模拟器 × Shell = 命令行体验。
模型
我(敲键盘)
│
▼
【终端模拟器】 ← 负责显示,传递我的按键
│
▼
【Shell (如 Bash)】 ← 解释命令,调用程序,返回结果
│
▼
【操作系统内核 (Linux)】 ← 真正做事Shell 命令分类索引
| 一级分类 | 二级分类(身份来源) | 如何理解 | 典型示例(记忆种子) |
|---|---|---|---|
| Shell 内置命令 | Bash 内建 | Shell 自身的一部分,没有独立可执行文件,不同 Shell 可能不同 | cd, echo, export, alias, jobs |
| Shell 内置命令 | Zsh 专有内建 | Zsh 增强的命令,通常是你换到 Zsh 的原因之一 | autoload, zmodload, compdef |
| 外部程序命令 | GNU Coreutils | 构成 Linux 最基础的文件、文本处理能力,GNU 项目的心血 | ls, cp, mkdir, cat, wc |
| 外部程序命令 | Util-linux | Linux 内核原生配套工具包,更底层的系统管理 | mount, fdisk, dmesg, lsblk |
| 外部程序命令 | 系统/第三方程序 | $PATH 里的其他所有程序,Shell 只是负责找到并运行它们 | git, python, docker, awk, sed |
| 特殊语法 | 管道与重定向 | 不是命令,是 Shell 解析的"连接词",把命令串成流水线 | |, >, <, &&, || |
| 特殊语法 | 通配符与展开 | Shell 在命令执行前做的替换,不同 Shell 能力差异巨大 | *, ?, ~(展开) |
shell脚本? bash脚本?
Bash 脚本就是一份用 Bash 语言编写、交由 Bash 解释器自动化执行的指令清单,它把我日常敲的命令和程序逻辑打包成一个可复用的程序文件。
bash 脚本的身份标识: 第一行的shebang
#!/bin/bash这是Shebang(释伴),告诉操作系统:“请用 /bin/bash 这个解释器来运行我”。
极简例子 greet.sh
#!/bin/bash
# 这是一个简单的 Bash 脚本
name="Alice"
echo "Hello, $name"- 让它可执行:chmod +x greet.sh
- 运行:./greet.sh
- 输出:Hello, Alice
这个文件里的 name="Alice" 和 echo "Hello, $name" 合起来,就是一段 Bash 脚本。