据我所知,每个操作系统都有不同的方式来标记行尾(EOL)字符。商业操作系统将回车符用于EOL(在Windows中,回车符和换行符;在Mac上,仅回车符)。另一方面,Linux仅将换行用于EOL。
Linux为什么不对EOL使用回车符(而仅对换行符使用)?
据我所知,每个操作系统都有不同的方式来标记行尾(EOL)字符。商业操作系统将回车符用于EOL(在Windows中,回车符和换行符;在Mac上,仅回车符)。另一方面,Linux仅将换行用于EOL。
Linux为什么不对EOL使用回车符(而仅对换行符使用)?
Answers:
Windows使用CRLF是因为它是从MS-DOS继承而来的。
CRLF之所以使用MS-DOS ,是因为它受已经使用的CP / M的启发CRLF。
CP / M和80年代及更早版本的许多操作系统都使用了CRLF它,因为它是结束电传打字机上打印的行的方式(返回到行的开头,然后跳到下一行,就像常规打字机一样)。由于不需要或只需很少的预处理,因此可以简化文件的打印。还有一些机械要求阻止了单个字符的使用。可能需要一些时间才能使笔架返回并使压板旋转。
Gnu / Linux使用LF它是因为它是Unix 克隆。1个
Unix LF从一开始就使用单个字符,以节省空间并标准化为规范的行尾,使用两个字符效率低下且模棱两可。这个选择是从Multics继承的,Multics早在1964年就使用了它。内存,存储,CPU能力和带宽非常稀疏,因此每行节省一个字节是值得的。打印文件时,驱动程序正在将换行符(换行符)转换为目标设备所需的控制字符。
LF之所以喜欢它,CR是因为后者仍然有特定用法。通过将打印的字符重新定位到同一行的开头,它可以使已键入的字符超标。
苹果最初决定也使用单个字符,但由于某种原因选择了另一个字符:CR。切换到BSD接口后,移至LF。
这些选择与操作系统是否商业化无关。
1这是您问题的答案。
\n
,与某些特定的输出设备无关。
维基百科上有关“换行符”的文章追溯了NL在1964年选择Multics作为行终止符(或分隔符)的情况;不幸的是,该文章对来源的引用很少,但是没有理由怀疑这是正确的。与CR-LF相比,这种选择有两个明显的好处:节省空间和设备独立性。
主要选择CR-LF源自用于在电传打字机上物理移动纸架的控制代码,其中CR将使纸架返回其原始位置,而LF将旋转纸辊以将打印位置向下移动一个线。这两个控制字符出现在ITA2代码中,该代码可以追溯到1924年,并且显然仍在使用中(请参阅Wikipedia)。ITA2显然是从1901年的Bauudot代码的Murray变体中获得的。
对于年轻的读者来说,值得注意的是,在大型机传统中,没有换行符。而是文件是一系列记录,记录长度可以是固定长度(根据打孔卡通常为80个字符)或可变长度;可变长度记录通常在每个记录的开头都存储有字符计数。如果您有一个包含一系列可变长度记录的大型机文件,每个记录包含任意二进制内容,那么将其无损地转换为UNIX样式的文件可能会很棘手。
当然,Linux只是Unix的重新实现,Unix从Multics做出了许多设计决策,因此看来关键决策是在1964年做出的。
其他答案可以追溯到1960年代的传承链和电传打字机。但是,这是他们没有涵盖的一个方面。
在电传打字时代,有时需要做一些称为“过度打击”的事情。有时会使用过度敲击来掩盖密码,因为删除密码只是不可行的。在其他时候,过分敲击是为了获得不在字体中的符号。例如,字母O和斜杠产生一个新符号。
通过在没有换行的情况下放入回车符来实现超击,尽管有时会使用退格键。由于这个原因,unix人们决定不使用回车作为行分隔符,而是选择换行。这对于阅读使用CRLF约定生成的文本也很有效。CR被吞下,LF成为分隔符。
虽然您可以将历史问题转换为有关C语言的问题,但Linux和所有POSIX兼容或POSIX风格的系统必须使用LF
(或至少使用任何C '\n'
字符)换行符的原因是交集的结果C和POSIX的要求。尽管C允许“文本文件”和“二进制文件”不同(实际上,文本文件可以是基于记录的,由一系列行记录组成,除了诸如在DOS / Windows上'\n'
与/从CR
/ 翻译成翻译等异国情调的东西外)LF
),POSIX要求文本和二进制模式的行为相同。这很大程度上是命令行工具之类的原因cat
强大/有用;如果它们仅适用于二进制文件,或仅适用于文本,但不能同时适用于两者,则它们的使用量会少得多。