为什么在脚本 (1) 的输出中换行符是 CR + LF(dos 风格)?

tei*_*ura 4 tty console typescript newlines

script命令的打字稿中(即在保存的文件中),换行符是 CR + LF (\r\n),尽管原始的(馈送到script)是 LF。为什么?这似乎是 tty 问题,我根本不知道。有人可以解释它没有太多细节吗?

我没有遇到任何麻烦;我只是好奇。:)(但我认为最好修复它,或者至少应该记录下来。)

script来自 util-linux,但可能没什么关系。

ica*_*rus 6

typescript输出捕获所有字符发送到PTY。例如stty -opost,如果您使用来阻止终端驱动程序将换行符正常更改为 CR+LF,那么您将看到输出中只有 LF 字符。

希望有用的提示,使用

col -b < typescript
Run Code Online (Sandbox Code Playgroud)

做第一遍清理文件。


小智 6

程序输出和捕获的 tty 流(例如typescript)之间存在差异的深层原因是 tty 曾经是printers

在 unix 之前,文本总是在行尾有一个 CRLF,不是因为它被认为是行终止的逻辑表示,而是因为每个字符都有真正的物理意义:将打印头一直向左移动,并推进纸张。

Unix 采取了一种全新的方法:它将磁盘上的文本文件视为一个有用的对象(不仅仅是打印机的指令),并将行视为逻辑实体。两个字符的行终止符在 unix 世界观中不必要地复杂。

但是他们必须使用现有的硬件 - 打印机和 CRT 哑终端无法识别单个“行尾”字符,而只能使用 CR 来完成一半的工作,而使用 LF 来完成另一半。因此必须进行转换,而且必须在离该硬件最近的位置完成 - 在 tty 驱动程序中。

从那时起,这一切都是向后兼容的。因此,您有一个坚持 CRLF 的终端模拟器,以及一个在程序输出换行符时提供它的 tty 驱动程序。