Linux 的 6 个经典功能,原来早有前辈做过

Linux 的 Shell、Tab 补全、BSD Socket、ELF、命名空间和 GNU 工具,都有更早的技术来路。小编按历史脉络解释六个常见功能,并附终端命令供您验证。

您每天在 Linux 里用的命令补全、网络连接和容器隔离,并不全是近几十年才出现的点子。很多设计早在大型机和早期 Unix 系统里就有雏形,后来经过不同团队改进,才变成今天熟悉的样子。

简单讲,这不是 Linux 把六套旧系统原封不动搬过来,而是一条技术接力线:研究系统提出想法,Unix 和 BSD 把它们变成实用工具,Linux 再吸收、扩展。下面按六个例子来看。

1. Multics 与 RUNCOM:Shell 和 .rc 文件的早期来路

命令也能像积木一样组合

1963 至 1964 年,Louis Pouzin 在 MIT 的 CTSS 系统里写了 RUNCOM。它能按顺序执行一组命令,适合把重复操作放进脚本。后来 Pouzin 又参与了 Multics 的命令处理设计,“shell”这个说法也在这段历史里逐渐成形。

Unix 延续了一个重要想法:Shell 不必是内核的一部分,它可以是一个普通的用户程序。于是您可以在不更换内核的情况下,从 Bash 换成 Zsh 或 Fish。Unix 文件名里的 rc 也留下了 RUNCOM 的痕迹,常被解释为 run commands。

想在自己的家目录里找找这段历史,可以运行:

ls -a ~ | grep rc

2. TENEX:命令行自动补全并不是新发明

先输入几个字母,再让系统补全

Using Linux tab completion to show output after typing 'sys'.

早期的 TENEX 系统运行在 DEC PDP-10 等机器上。用户输入命令或文件名的开头,再按 ESC,系统就会尝试补全;如果有多个候选项,就提示用户继续输入。这和今天按 Tab 补全的体验很接近。

后来,Ken Greer 把 TENEX 风格的文件名补全带进 C Shell,之后发展为 tcsh。今天 Bash 则通过 GNU Readline 等组件处理补全。您可以输入 sys,再连续按两次 Tab,看看系统里有哪些以它开头的命令。

3. 4.2BSD:Linux 网络程序常用的 Socket 接口

Socket 是程序申请网络连接的通用入口

Checkong the socket summary on the Linux terminal using the ss command.

BSD 系统把 Socket 接口发展成一套通用的网络编程方式。可以把它理解成程序与内核网络协议栈之间的“窗口”:程序通过创建、绑定、连接和收发数据等调用,与本机或远端服务通信。

Linux 提供的是 BSD 兼容的 Socket 用户接口,所以很多网络程序能在不同 Unix-like 系统之间移植。您可以运行 ss -s,查看当前系统的 Socket 统计摘要。

4. System V Release 4:ELF 成为 Linux 程序的常见格式

可执行文件需要告诉系统怎样加载自己

Linux terminal running file -L /bin/ls, which shows an ELF 64-bit executable, and ldd /bin/ls, which lists the shared libraries it needs

程序编译完成后,不只是得到一串机器指令,还需要一种格式告诉系统:入口在哪里、代码和数据放在哪里、需要哪些共享库。ELF(Executable and Linkable Format,可执行与可链接格式)在 System V Release 4 时代成为重要标准,后来也被 Linux 广泛采用。

与早期 a.out 格式相比,ELF 更适合现代动态链接和共享库。您可以用 file -L /bin/ls 查看系统程序的文件类型;如果要检查动态库依赖,请只对可信的本机程序使用 ldd。

5. Plan 9:进程命名空间给容器隔离提供了思路

同一台机器,不同进程可以看到不同的系统视图

Using the lsns command for listing namespaces on the Linux terminal.

Bell Labs 的 Plan 9 研究系统强调:不同进程可以拥有各自的命名空间,也就是各自看到的文件和资源视图。Linux 后来发展出 mount、PID、network 等多种 namespace,让进程在同一内核上拥有相对隔离的环境。

容器并不是一台完整的虚拟机。以 Docker 为例,它会组合命名空间、控制组和文件系统等机制,让应用看起来像是在自己的小环境里运行。您可以运行 lsns,查看当前系统中有哪些命名空间。

6. GNU:Linux 发行版常用工具和许可证的重要来源

Linux 内核与 GNU 工具是不同部分

Checking the bash version on a Linux terminal.

GNU 项目在 1983 年启动,目标是建立一个自由的 Unix-like 系统,并提供编译器、Shell、命令行工具等基础软件。Linux 内核后来采用 GPLv2,GNU 工具也成为许多 Linux 发行版的重要组成部分。

因此,“Linux”在日常说法里经常指整个发行版,但从技术上看,Linux 是内核,Bash、GCC、Coreutils 等则是围绕它工作的用户空间工具。您可以运行 bash --version,查看当前 Bash 的版本信息。

六个例子放在一起看

早期系统或项目 留下的影响 今天可以怎样观察
CTSS / Multics RUNCOM、Shell 的设计脉络 查看 .bashrc 等配置文件
TENEX 命令与文件名补全 在终端按 Tab
BSD Socket 网络接口 运行 ss -s
System V ELF 可执行文件格式 运行 file -L /bin/ls
Plan 9 进程命名空间的思路 运行 lsns
GNU 常用工具与 GPL 生态 运行 bash --version

常见问题(FAQ)

Linux 是不是直接复制了这些旧系统?

不是。更准确地说,是不同系统之间的设计影响和再实现。许多想法经过 Unix、BSD 和后来的 Linux 社区多次修改。

.bashrc 里的 rc 到底是什么意思?

它通常被追溯到 RUNCOM,也就是 run commands,指一组启动或执行命令的配置。

Socket 只能在 Linux 上用吗?

不是。BSD 风格的 Socket 接口被许多 Unix-like 系统采用,Linux 也提供兼容实现。

Linux 的 namespace 就等于 Docker 吗?

不是。namespace 是内核提供的隔离机制之一,Docker 等容器工具会把它与其他功能组合起来使用。

GNU 和 Linux 是同一个东西吗?

不是。Linux 是内核,GNU 提供了大量常用用户空间工具和相关软件生态;发行版通常把它们组合在一起。

总结

Linux 的许多常用功能都有更早的技术来路:从 RUNCOM 和 Shell,到补全、Socket、ELF、namespace,再到 GNU 工具。理解这段历史,能让您更容易看懂今天的系统为什么这样设计。若您还想看看操作系统设计如何延续到新项目,可以接着读三个用大模型写出来的操作系统,离替代 Windows 还很远。

如果想动手试试系统设置,可以看 Fedora 45 装完先做这8步,KDE版设置一次搞定,里面有一组可以直接照着敲的装机后命令。

参考资料:The Origin of the Shell;Linux socket(7);Plan 9 per-process namespaces 讨论。