xxyi

shell 基础:Unix / Linux / GNU / POSIX 一次讲清楚

2026-05-18

如何理解 Unix

Unix 是 1969 年在贝尔实验室诞生的一款操作系统,由肯·汤普森和丹尼斯·里奇等人用汇编语言写出,后来用 C 语言重写。它开创了一套影响至今的设计哲学和工程实践。

三个核心特点

  1. 一切皆文件:在 Unix 里,普通文件、目录、键盘、鼠标、硬盘、进程间通信,甚至网络连接,都被抽象为文件。你可以用同一套系统调用(openreadwriteclose)去操作它们。这使得程序接口极度统一和简洁。
  2. 小而美的工具组合:Unix 提倡"做好一件事"的设计原则。每个命令行工具只专注一个功能(比如 grep 搜索文本、sort 排序、wc 统计),然后通过管道(|)将它们串联起来完成复杂的任务。这种模块化思想深刻影响了后续软件开发。
  3. 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(包含 lscpmvcat 等基本命令)
  • 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-linuxLinux 内核原生配套工具包,更底层的系统管理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 脚本。