Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Linux工具将CR字符显示为“^M”?_Linux - Fatal编程技术网

为什么Linux工具将CR字符显示为“^M”?

为什么Linux工具将CR字符显示为“^M”?,linux,Linux,我是Linux新手,如果我的问题听起来很愚蠢,很抱歉 我们知道Linux和Mac OS X使用\n(0xa),这是ASCII换行符(LF)。MS Windows和Internet协议(如HTTP)使用序列\r\n(0xd 0xa)。如果您在Windows中创建一个文件foo.txt,然后在Linux文本编辑器中查看它,您将在每行末尾看到一个恼人的^M,这就是Linux工具显示CR字符的方式 为什么Linux工具将CR字符显示为^M?我的理解是,\r(回车符)是将光标移动到当前行的开头,因此显示它

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

我们知道Linux和Mac OS X使用
\n
(0xa),这是ASCII换行符(LF)。MS Windows和Internet协议(如HTTP)使用序列
\r\n
(0xd 0xa)。如果您在Windows中创建一个文件foo.txt,然后在Linux文本编辑器中查看它,您将在每行末尾看到一个恼人的
^M
,这就是Linux工具显示CR字符的方式

为什么Linux工具将CR字符显示为
^M
?我的理解是,
\r
(回车符)是将光标移动到当前行的开头,因此显示它的明智方法是,当您打开文件时,您会看到光标位于行的开头(包含
\r
),因此不应显示
^M


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

ASCII控制字符,如制表符、CR、,NL和其他设备旨在控制类似电传打字机的显示设备的打印位置

文本编辑器不是这样的设备。文本编辑器不适合将CR字符按字面意思处理为“转到第一列”;这将使编辑经历变得混乱不堪

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

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

这就是说,在实际的Linux内核中有一个特性,可以使用
^M
符号表示控制字符,如CR。任何给定TTY设备的TTY行规程都可以配置为以这种表示法打印字符,但只能在回显接收到的字符时进行

演示:


在上面,我输入的Ctrl-F作为
^F
返回。因此,实际上有一个“Linux编辑器”使用了这种符号:“规范输入模式”行规程的基本行编辑器。

超级用户中的相关交叉重复:查看您在哪些编辑器中看到了这一点?当Vim、Emacs和Nano检测到文件有DOS行终止符时,它们都不会这样做。(当文件有混合行终止符时,Vim和Emacs会这样做,但在这种情况下,您显然想知道)谢谢您的回答。假设一个文件有三行,我想要这样的行为:当我打开文件时,光标应该在第二行的开头,那么在存储文件时应该使用哪个控制字符?@slowjams文件中没有任何东西可以这样控制编辑器。一个简单地将数据转储到显示器上从而使光标移动的编辑器将不是很有用;编辑器必须保护用户不受这种影响。@slowjams您可以准备一个文件,如果您
cat
将它发送到终端,它将控制光标。您当然可以创建一个三行文件,这样当它转储到终端时,光标将位于第三行的开头。你可以通过一个嵌入的CR来实现这一点。@slowjams换行符(LF)通常会将光标移动到下一行的开头;i、 e.它执行换行和回车操作。这不是由ASCII指定的;这是一种愚蠢的行为。这种行为也不是硬编码的;它是由TTY标志(
stty onlcr
)配置的默认值。它与使用LF作为文本文件中的行终止符的文件密切相关。如果我们将文本文件转储到终端,它看起来是正确的,因为在发送到终端仿真器之前,TTY驱动程序会将换行符转换为CR-LF,这要归功于
stty onlcr
设置。如果执行
stty-onlcr
cat
文件,您将看到一个“楼梯”因为现在每行后面的换行符只会直接向下移动光标,而不会将光标移动到行首。
$ 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
$