Tty
為什麼在腳本 (1) 的輸出中,換行符是 CR + LF(dos 樣式)?
在
script
命令的打字稿中(即在保存的文件中),換行符是 CR + LF (\r\n),儘管原來的(饋給script
)是 LF。為什麼?這似乎是 tty 問題,我根本不知道。有人可以在沒有太多細節的情況下解釋它嗎?我沒有任何麻煩;我只是好奇。:) (但我認為最好修復它,或者至少應該記錄在案。)
我
script
來自 util-linux,但可能無關緊要。
typescript
輸出擷取發送到 pty 的所有字元。例如,如果您使用stty -opost
阻止終端驅動程序將換行符正常更改為 CR+LF,那麼您將看到輸出中只有 LF 字元。希望有用的提示,使用
col -b < typescript
在清理文件時進行第一遍。
程序輸出和擷取的 tty 流(例如)之間存在差異的深層原因
typescript
是 tty 曾經是列印機。在 unix 之前,文本總是在行尾有一個 CRLF,不是因為它被認為是行終止的邏輯表示,而是因為每個字元都具有真正的物理意義:將列印頭一直向左移動, 並推進紙張。
Unix 採用了一種激進的新方法:它將磁碟上的文本文件本身視為有用的對象(不僅僅是列印機的指令),並將行視為邏輯實體。兩個字元的行終止符在 unix 世界觀中是不必要的複雜。
但是他們必須使用現有的硬體——列印機和 CRT 啞終端,它們不能辨識單個“行尾”字元,而只能用 CR 來完成一半的工作,而 LF 來完成另一半的工作。所以必須進行翻譯,並且在最接近該硬體的位置完成 - 在 tty 驅動程序中。
從那時起,這一切都是向後兼容的。因此,您有一個堅持使用 CRLF 的終端仿真器,以及一個在程序輸出換行符時提供它的 tty 驅動程序。