Unix
- 1969年,AT & T 贝尔实验室的 Ken Thompson, Dennis Ritchie 等人发明了 Unix 操作系统;
- 1970s-80s,Unix 开始在大学和科研机构中流行。尤其是伯克利的 BSD 版本,以及其他版本,AIX(IBM)、Solaris(Sun)、HP-UX(惠普)等;
- 版本的过多导致了混乱,不同版本的参数不一致,写一次代码,要到处调试(Write once, debug everywhere),让程序员苦不堪言;
- 1988年,IEEE(电气电子工程师学会),牵头制定了“最小公倍数”标准,把各家 Unix 共通的、最好的部分抽出来,写成一份白皮书,取名 POSIX;
- 1991年,林纳斯·托瓦兹写 Linux 时,刻意绕开 Unix 源码(为了规避版权官司),但严格照着 POSIX 标准来设计接口,实现了大量 POSIX 标准,但也加入了很多 Linux 自己扩展;
- macOS,含有大量来自 BSD(Unix)的代码。所以说“macOS 是真正的 Unix”;
POSIX
- POSIX(Portable Operating System Interface,可移植操作系统接口)是 IEEE 制定的一套标准。是操作系统界的“通用语言”或“USB-C接口”。
- 定义的是一套 API、Shell、工具、行为规范,使遵循该标准的系统具有源代码级可移植性。
- 规定的是"应该提供什么接口以及这些接口应该如何表现",而不是规定内核如何实现这些接口。
- 核心目的:保证“源代码级”的可移植性。在一台 POSIX 兼容的机器(如 Linux)上写的 C 语言代码,拿到底层不同的另一台 POSIX 机器(如 macOS 或某个实时系统)上,只需要重新编译,不需要重写代码,就能正确运行;
- 不是规定内核怎么实现,而是规定“外壳(接口)”长什么样:
- 系统调用:open(), read(), write(), fork(), exit() 必须有且功能一致。
- Shell 命令:ls, cd, echo, grep 的行为必须一致。
- 环境变量:PATH, HOME 的语义必须一致。
- 用户/组:root, uid, gid 的概念必须存在。
- macOS 和 Linux 都完全遵守 POSIX 标准,所以它们是 POSIX 系统;
- POSIX 是 Unix 的儿子(诞生于 Unix 的混乱),却是 Linux 的教科书(Linux 照着它写),同时也是 macOS 的身份证(macOS 靠它认证为 Unix)。
shell
- Shell 是一个“解释器程序”;
- bash 和 zsh 是 Shell 的两种“方言”。
“内置命令”和“外部工具”
内置命令(Built-in),比如 cd(切换目录)、exit(退出)、export(设置环境变量)、echo(在某些 Shell 中是内置的)。
外部工具(External Commands),比如 find(找文件)、sed(流编辑)、grep(行过滤)。特点:它们是硬盘上独立的可执行文件,通常躺在 /bin/、/usr/bin/ 或 /usr/local/bin/ 里。Shell 只是帮你“启动”它们。
在终端输入 type echo 和 type grep。
type echo
echo is a shell builtin
type cd
cd is a shell builtin
type find
find is /usr/bin/find解管道 |
| 是 fork() 两个子进程,然后用 dup2() 系统调用把左边进程的 1(标准输出) 和右边进程的 0(标准输入) 强行粘在一起。