为什么Linux工具将CR字符显示为"^M"



我是Linux新手,很抱歉我的问题听起来很愚蠢。

我们知道Linux和Mac OS X使用n(0xa(,这是ASCII换行符(LF(字符。MS Windows和诸如HTTP之类的因特网协议使用序列rn(0xd 0xa(。如果你在Windows中创建了一个文件foo.txt,然后在Linux文本编辑器中查看它,你会在每行的末尾看到一个令人讨厌的^M,这就是Linux工具显示CR字符的方式。

但是为什么Linux工具将CR字符显示为^M?根据我的理解,r(回车(是将光标移动到当前行的开头,所以显示它的明智方法是,当你打开文件时,你看到光标在该行的开头(包含r(,所以不应该显示^M

PS:有些人发布了如何删除^M的答案,但我不知道为什么最终会显示^M,而不是在开始时移动光标,这就是回车的定义。

ASCII控制字符,如TAB、CR、NL和其他字符,用于控制类似电传打字机的显示设备的打印位置。

文本编辑器不是这样的设备。对于文本编辑器来说,将CR字符从字面上视为"意思"是不合适的;转到第一列";;这会使编辑经验变得杂乱无章。

文本编辑器通过解析文本文件的表示来创建呈现给用户的内部表示。在类Unix操作系统上,文件由零行或多行表示,这些行以ASCII NL字符结尾。出现的任何CR字符看起来只是数据的一部分,而不是行分隔的一部分。

并非所有的编辑器都有相同的行为方式。例如,Vim编辑器将检测到文件使用CR-LF行结尾,并使用该表示正确加载该文件。为该缓冲器设置一个标志,指示它是一个"缓冲区";DOS";文件,以便在保存时复制相同的表示形式。

也就是说,在实际的Linux内核中,有一个功能可以使用^M表示CR等控制字符。任何给定TTY设备的TTY行规程都可以配置为打印此符号中的字符,但仅当回显接收到的字符时。

演示:

$ stty echoctl # turn on notational echo of control characters
$ cat # run some non-interactive program with rudimentary line input
^F^F^F^F^F^F
^C
$

上面,我输入的Ctrl-F被回显为^F。因此,事实上;Linux编辑器";它使用这种表示法:;规范输入模式";线路纪律。

最新更新