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