我无法理解以下 Unix 哲学背后的原因。
从LINFO 网站:Unix 哲学的一个重要原则是尽可能避免将数据和程序存储在二进制文件中。相反,它们应该存储在纯文本文件中,因为文本是程序和人类之间的通用接口。正是使用文本输出和输入,类 Unix 操作系统中的程序才能如此轻松高效地协同工作(即通过使用管道)。虽然文本文件可能不如二进制文件那么快(或那么小),但现代处理器的高速(以及内存和存储的低成本)很容易弥补这一点。
如果可能的话,请解释一下。
答案1
简单回答一下你的问题,你引用的文章有点错误。Unix 哲学是一切都是文件,但这并不意味着文本文件。一个具体的例子就是套接字。例如参见Gilles 的回答这里:套接字是一个文件,但这并不一定意味着它有文件名并且不必存在于硬盘上,并且通过套接字传递的数据不一定是文本而是特定的字节序列。
管道本身,尤其是匿名管道,如|
,本身可以是文件,而不存在于磁盘上。通过管道传递的数据可以是任何类型 - 二进制或文本。其中一个例子是将 iso 映像的压缩存档通过管道传输到dd
命令以将其写入磁盘。
除此之外,文本文件也不一定比二进制文件慢。如果你用来读取文本文件的程序(适当地)利用了mmap()系统调用,将文件完全或部分映射到 RAM,众所周知,RAM 速度很快。有没有想过为什么tail
可以非常快速地获取 GB 大小的文件的最后几行?好吧,如果您strace
在 上运行系统调用分析器tail
,它将向您显示正在 mmap()
发生系统调用。
处理器的速度在这里也无关紧要,如果你用来读取文件的程序是顺序程序(而不是并行程序,因此不能使用多核),或者记忆墙问题内存总线宽度/内存速度无法支持 CPU 的速度。
关于这一点:
相反,它们应该存储在纯文本文件中,因为文本是程序和人类之间的通用界面。
是的,文本可以方便机器与人之间的交流,但出于安全考虑,我们有理由将数据存储在加密的二进制形式中,对于攻击者来说,数据看起来只是一串字节,一团乱麻。