Unix的工作原理:成为更优秀的软件工程师(一)
网文翻译Unix的工作原理成为更好的软件工程师 |尼尔·卡卡尔Unix很漂亮。让我给你画一些快乐的小树。我不会解释一堆命令——那太无聊了网上已经有无数教程了。我留给你对这个系统进行推理的能力。你想做的每一件花哨的事只要谷歌一下就能完成。但理解为什么解决方案能达到你想要的效果并不相同。这才是真正赋予你力量的是不害怕的力量。既然押韵那一定是真的。假设你是从零开始我会设置足够让我们一起玩的命令。我们会探索概念在 、 中看到它们的实际操作然后大喊“我懂了”在此过程中我们还会弄清楚a到底是什么。shellshell但我们不能不进入创作者的内心探索Unix的理念。目前我们可以假设Linux就是Unix。如果你想知道为什么不是这样可以直接跳到底部再回来。我们将彻底结束Unix与Linux的混淆。理念让我们从核心说起——Unix背后的理念。写出只做一件事并且做得好的程序。编写程序来协同工作。不要额外输出不要强求互动输入写程序处理文本流因为那是一个通用接口。Unix还采纳了“越差越好”的理念。这种思维非常强大。在更深层次上我们在函数式编程中经常看到构建专注于某一事物的原子函数不增加额外输出然后将它们组合起来做复杂的事情。组合中的所有函数都是纯函数。没有全局变量需要跟踪。或许正因如此Unix 的设计侧重于两个主要组成部分进程和文件。Unix中的一切都不是进程就是文件。别无他物。进程和文件之间存在周期性依赖——如果我们深入解释其中一方就需要另一方来支持。为了打破这个循环我们将先简要介绍每个项目然后深入探讨。我们会重复几次以探究底层。进程你运行的浏览器是一个进程。如果你开着终端它也同样重要。2如果没有现在是打开它的好时机。如果你用的是Windowsdocker也表现很好。如果你用的是Mac你可以直接在Mac上用cmd——这是个Unix环境。更抽象地说进程是一个正在运行的代码实例。操作系统会给进程提供资源比如内存然后附加一些元数据比如拥有者是谁然后运行代码。操作系统作为资源的一部分还为每个进程提供3个打开文件、和。stdinstdoutstderr文件所有非过程的都是文件。是的这意味着你的打印机、扫描仪、终端屏幕任何进程的代码都是档案。如果这听起来很困惑请继续阅读。我们会清理的。你在文件系统上的文件就是文件——一串字节串联起来创造出有意义的东西。你的照片是文件。你的目录也是文件它们只是包含当前目录中存在的文件/目录列表就像树一样。它的好处是我还能“打开”目录文件查看内容例如$ vim . Netrw Directory Listing (netrw v162) /Users/Neil/examples Sorted by size Quick Help: F1:help -:go up dir D:delete R:rename s:sort-by x:special ../ ./ git-example/ unix-git/ unix-file-system-example/以前打开过一个叫 .这听起来熟悉吗这是Unix存储当前目录的方式。如你所见它包含当前目录中的文件/目录列表。Vim.文件只是一串数据流。文件与文件系统有了“一切都是文件”和“文件是数据流”的理念我们可以进一步探讨事物的工作原理。在Unix系统中输入和写输出的流是预先定义的。这正是标准输入、标准输出和标准误的意义所在。stdin stdout stderrstdin是输入数据源。stdout是输出数据源。stderr是标准误差的输出源。在shell3输入你的键盘数据和 都是屏幕。stdinstdoutstderr4现在我们可以把这些流重新定向到别处我们的程序也不必知道无论输入来自哪里键盘还是文本文件对于任何正在运行的进程输入都是来自 。同理对于和。当我们谈到与这些流共处的流程时我们会详细讨论。stdinstdoutstderriNode要建立文件系统你需要一个结构来管理文件系统。文件中不仅有数据需要处理还有关于数据本身的信息称为元数据。这包括数据存储地点、谁拥有以及谁能查看数据。这就是inode——你文件元数据的数据结构。每个文件都有唯一的inode编号。这成为文件存在时的唯一标识符。$ ls -li total 0 2015005 drwxr-xr-x 6 neil X 192 23 Oct 07:36 git-example 2514988 drwxr-xr-x 4 neil X 128 9 Oct 11:37 unix-git/ 2020303 drwxr-xr-x 4 neil X 128 23 Sep 11:46 unix-file-system-example/看到第一栏的那些数字了吗那是iNodeiNode 存储所有元数据。 查看这些元数据也很有用。$ stat -LF .drwxrwxrwx 7 A B 224 Oct 28 07:15:48 2018 ./和 分别是用户名和组名。Unix 是一个多用户系统。Unix 就是这样做的—— 用户和组是文件的属性。AB将用户属性设置为X的文件表示X拥有该文件。 用户对Unix来说就只有这个功能。224是文件大小或文件中的字节数。Oct 28 07:15:48 2018是最后修改日期。我这些信息是从哪里来的。man ls现在说说我没提到的有趣数字和字符和。drwxrwxrwx