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

Bag*_*aya 91 history files newlines

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

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

jll*_*gre 343

Windows 使用CRLF它是因为它从 MS-DOS 继承了它。

MS-DOSCRLF之所以使用,是因为它受到 CP/M 的启发,CP/M 已经在使用CRLF.

CP/M 和 80 年代及更早的许多操作系统都使用CRLF它,因为它是结束电传打字机上打印的一行的方式(返回到行首并跳转到下一行,就像普通打字机一样)。这简化了打印文件,因为需要较少或不需要预处理。还有一些机械要求阻止了单个字符的使用。可能需要一些时间让托架返回和压板旋转。

使用 Gnu/LinuxLF是因为它是 Unix克隆1

UnixLF从一开始就使用单个字符 ,以节省空间并标准化为规范的行尾,使用两个字符效率低下且含糊不清。这个选择继承自早在 1964 年就使用它的 Multics。内存、存储、CPU 能力和带宽非常稀少,因此每行节省一个字节是值得的。打印文件时,驱动程序将换行(换行)转换为目标设备所需的控制字符。

LF首选,CR因为后者仍然有特定的用法。通过将打印的字符重新定位到同一行的开头,它可以覆盖已经输入的字符。

Apple 最初决定也使用单个字符,但出于某种原因选择了另一个字符:CR. 当它切换到 BSD 界面时,它移动到LF.

这些选择与操作系统是否商业化无关。

1这是你问题的答案。

  • 电传打字机是从非电动打字机那里得到的。CR-LF 描述了当您推动左侧的杠杆时所采取的机械动作。将保持压板(滚轮)的“托架”一直向右放回(将按键置于左侧的第一个位置),然后将压板按行高度旋转以移动到下一个可打字行。是的,我无可否认在这里暴露了我的年龄。 (47认同)
  • Multics 使用换行符与同时代的 ISO/IEC 646 一致,如果需要单字符表示,该标准规定它可以用单个字符同时表示回车和换行符。 (22认同)
  • 尽管如此,Saltzer 和 Ossanna 于 1970 年发表的论文(_Multics 中的远程终端字符流处理_)非常清楚地表明设备独立性_是_原因。 (14认同)
  • 我怀疑选择单个字符的真正原因是为了节省空间。真正的原因是定义一个独立于输出设备(终端等)的 *newline* 字符。然后终端(或类似)驱动程序负责将换行符转换为适当的控制字符序列,通常是 CR LF。这允许在使用字符串编程时进行很好的抽象:换行符以单个“\n”呈现,独立于某些特定的输出设备。 (10认同)
  • @JdeBP 这篇论文指出 *** 归约 ** 为传入和传出远程终端的字符流的规范形式是本文的主题*。减少到规范形式也是一种节省空间的方法。换句话说,使用两个字符是一种低效且含糊不清的空间浪费。 (4认同)
  • @JohanMyréen 节省空间可能不是唯一的动机,我同意标准化和设备独立性也是其中之一,但节省空间肯定是使用单个字符的一个很好的理由。 (3认同)
  • 请注意,许多网络协议也使用 CR+LF。使用 EBCDIC(没有 CR 或 LF 的直接表示)的旧 IBM 硬件使用 NL(在 ASCII 中不存在)。Unicode 还为我们提供了其他替代方案,例如 U+2028 LINE SEPARATOR。 (3认同)

use*_*929 17

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

主要替代方案 CR-LF 源自用于在电传打字机上物理移动纸架的控制代码,其中 CR 将纸架返回到其原始位置,而 LF 将旋转纸辊以将打印位置向下移动一个线。这两个控制字符出现在可追溯到 1924 年的 ITA2 代码中,该代码显然仍在使用中(参见维基百科);显然 ITA2 从可追溯到 1901 年的 Baudot 代码的 Murray 变体中获取它们。

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

当然,Linux 只是 Unix 的重新实现,而 Unix 的许多设计决策都来自 Multics,所以看起来关键决策是在 1964 年做出的。


Wal*_*tty 13

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

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

  • 可能还值得注意的是,一些电传打字机要求 CR 后跟一个非打印字符,以便在下一个打印字符到达之前给回车时间完全循环,并且根本不支持退格,因此在 CR 之后发送 LF没有任何费用,完成叠印的唯一方法是通过 CR。 (2认同)

R..*_*ICE 7

虽然您可以将历史问题转化为关于 C 语言的问题,但 Linux 和所有符合 POSIX 或 POSIX 的系统必须使用LF(或至少是任何 C'\n'字符)作为换行符的原因是交集的结果C 和 POSIX 的要求。虽然C允许“文本文件”和“二进制文件”,以不同(其实文本文件,可以记录为基础组成的行记录的序列中,除了少异国情调的东西就像'\n'翻译成/自CR/LF像DOS / Windows的),POSIX 要求文本和二进制模式的行为相同。这主要是命令行工具喜欢的原因cat强大/有用;如果它们只处理二进制文件,或者只处理文本,而不是两者,那么它们就会少得多。

  • 这个选择比 POSIX 早了很多年。正如 jlliagre 的回答中提到的,它可以追溯到 Unix 的开始,它从 Multics 复制了它。 (13认同)
  • * 在 Linux* 中的选择并不比 POSIX 早很多年。当然,POSIX 将已经存在的实践编成法典,因为这是它存在的全部理由。 (4认同)