为什么Linux使用LF作为换行符?


87

据我所知,每个操作系统都有不同的方式来标记行尾(EOL)字符。商业操作系统将回车符用于EOL(在Windows中,回车符和换行符;在Mac上,仅回车符)。另一方面,Linux仅将换行用于EOL。

Linux为什么不对EOL使用回车符(而仅对换行符使用)?


77
Mac早在OS X之前就没有使用CR ...我相信现在使用* nix风格的LF。
B层

33
我认为也有/已经有许多商业Unixy OS :。
ilkkachu

20
Wikipedia上解释。基本上在上个60年代,Multics(启发了Unix,启发了Linux)增加了某种程度的抽象,以避免电传打字机设备的局限性使文本编码受阻,因此不必在两个字符上编码换行符(这样可以减少换行符)当然是50年后)。
斯特凡Chazelas

74
第二段是一个有效的问题,但是第一段充满了过分的简化和彻底的错误,以致于淹没了它,答卷者甚至不得不纠正一大堆虚假和错误的前提,然后才去解决问题。
JdeBP

21
什么?Linux是称为UNIX的商业OS标准的免费近似。当时,与UNIX兼容的系统要花很多钱,而今天仍然如此。
errantlinguist

Answers:


334

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这是您问题的答案。


20
Multics使用换行符与现代ISO / IEC 646一致,该规范规定,如果需要一个字符的表示,则可以将换行符作为同时表示回车和换行的一种方式。
JdeBP

10
我怀疑选择单个字符的真正原因是为了节省空间。真正的原因是,以限定单个换行字符的独立于所述输出设备(终端等)的终端(或类似的),则驱动程序将新行转换为所述appripriate控制字符序列,一般CR LF的照顾。这样在使用字符串进行编程时可以很好地抽象出来:换行符以单个表示\n,与某些特定的输出设备无关。
约翰·迈伦(JohanMyréen)

14
尽管如此,Saltzer和Ossanna(Multics中的远程终端字符流处理)在 1970年发表的论文很清楚地表明了设备独立性原因。
JdeBP '17

3
@JdeBP本文陈述了将往返于远程终端的字符流的规范化形式简化本文的主题。简化为规范形式是节省空间的一种方法。换句话说,使用两个字符是效率低下和模棱两可的空间浪费。
jlliagre

46
电传打字机是从非电动打字机得到的。CR-LF描述了您向左推动控制杆时所采取的机械动作。返回将压板(滚轴)一直保持在最右边的“托架”(将击键键置于左侧的第一个位置),然后将压板曲柄旋转一行高度,以移动到下一个可印刷的行。是的,我承认这里是我的年龄。
cdkMoose

17

维基百科上有关“换行符”的文章追溯了NL在1964年选择Multics作为行终止符(或分隔符)的情况;不幸的是,该文章对来源的引用很少,但是没有理由怀疑这是正确的。与CR-LF相比,这种选择有两个明显的好处:节省空间和设备独立性。

主要选择CR-LF源自用于在电传打字机上物理移动纸架的控制代码,其中CR将使纸架返回其原始位置,而LF将旋转纸辊以将打印位置向下移动一个线。这两个控制字符出现在ITA2代码中,该代码可以追溯到1924年,并且显然仍在使用中(请参阅Wikipedia)。ITA2显然是从1901年的Bauudot代码的Murray变体中获得的。

对于年轻的读者来说,值得注意的是,在大型机传统中,没有换行符。而是文件是一系列记录,记录长度可以是固定长度(根据打孔卡通常为80个字符)或可变长度;可变长度记录通常在每个记录的开头都存储有字符计数。如果您有一个包含一系列可变长度记录的大型机文件,每个记录包含任意二进制内容,那么将其无损地转换为UNIX样式的文件可能会很棘手。

当然,Linux只是Unix的重新实现,Unix从Multics做出了许多设计决策,因此看来关键决策是在1964年做出的。


12

其他答案可以追溯到1960年代的传承链和电传打字机。但是,这是他们没有涵盖的一个方面。

在电传打字时代,有时需要做一些称为“过度打击”的事情。有时会使用过度敲击来掩盖密码,因为删除密码只是不可行的。在其他时候,过分敲击是为了获得不在字体中的符号。例如,字母O和斜杠产生一个新符号。
通过在没有换行的情况下放入回车符来实现超击,尽管有时会使用退格键。由于这个原因,unix人们决定不使用回车作为行分隔符,而是选择换行。这对于阅读使用CRLF约定生成的文本也很有效。CR被吞下,LF成为分隔符。


谢谢您的准确记忆。退格键和回车符(单独使用)也用于打印机以产生粗体或带下划线的字符。回到起源,这两个命令早在1930年就已经存在,可以使“运输车”“返回”到其最左边的位置,或者是过度罢工,或者是允许在“新行”的帮助下开始新的行使滚筒旋转一级的键。请参阅:en.wikipedia.org/wiki/IBM_Electric_typewriter。因此,“ CR” +“ LF”的日期早于计算机历史。

可能还值得注意的是,某些电传打字机要求在CR后面加上非打印字符,以便在下一个打印字符到达之前给回车时间以完整的周期,并且根本不支持退格,因此在CR之后发送LF无需花费任何费用,完成套印的唯一方法是通过CR。
超级猫

“电传打字的日子”开始于计算机时代之前。在1960年代,许多计算机都为操作员提供了控制台电传打字机,甚至更多地使用ASCII作为其字符集。
Walter Mitty

7

虽然您可以将历史问题转换为有关C语言的问题,但Linux和所有POSIX兼容或POSIX风格的系统必须使用LF(或至少使用任何C '\n'字符)换行符的原因是交集的结果C和POSIX的要求。尽管C允许“文本文件”和“二进制文件”不同(实际上,文本文件可以是基于记录的,由一系列行记录组成,除了诸如在DOS / Windows上'\n'与/从CR/ 翻译成翻译等异国情调的东西外)LF),POSIX要求文本和二进制模式的行为相同。这很大程度上是命令行工具之类的原因cat强大/有用;如果它们仅适用于二进制文件,或仅适用于文本,但不能同时适用于两者,则它们的使用量会少得多。


13
这种选择比POSIX早许多年。正如jlliagre的回答中所提到的,它可以追溯到Unix的开始,后者是从Multics复制它的。
Barmar

4
Linux中的选择要比POSIX早很多年。当然,POSIX整理了已经存在的做法,因为那是其存在的全部理由。
R.,

就Linux而言,首先没有真正的选择。Linux使用的Gnu标准库是POSIX的最新版本,并且自换行以来就一直使用换行,这是出于明显的兼容性原因,因为它是在Unix系统上开发,测试和使用的。Linux内核旨在向标准C库(GNU或其他)提供类似Unix的系统调用,并且增加了处理不同文本文件和二进制文件所需的复杂性,这会过分夸大并破坏与现有代码的兼容性。对于托瓦尔兹来说,这简直是荒谬的。
jlliagre

@jlliagre:仍然可以选择使某些东西与现有做法兼容,而不是随机的,无用的不兼容性。您只能说在假设Linux成功的情况下这不是一个选择。大量的人使玩具爱好者OS充满了各种古怪的选择,而且他们从来没有去过任何地方。
R.,

@RI表示Linux只是一个内核,它本质上需要GNU才能工作(最初Torvalds的目标是与minix而不是gnu兼容,但这在这里没有区别)。换行选择与Linux无关,因为它是在编写Linux之前花费了很长时间。在各种Linux版本中,有很多或多或少的无聊古怪的选择,它们并没有阻止Linux的成功。原因之一可能是许多这些选择后来都被重新考虑了。
jlliagre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.