终端中自动翻译换行符

终端中自动翻译换行符

我跟着这里

我注意到(这并不完整,仅供演示)此时:

#include <termios.h>

  raw.c_iflag &= ~(ICRNL | IXON);
  raw.c_oflag &= ~(OPOST);
  raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);

使它变得像这样:

printf("\n");

只需前进到下一行,而不将光标移动到开头。文本解释说通常\n会被翻译成\r\nOPOST禁用它。

相关地,该ICNRL标志使得^M终端能够正确接收回车(通过 )。

该手册毫无启发性:

OPOST 启用实现定义的输出处理。

有人可以更详细地解释历史以及这里发生的事情吗?

那么在对文件进行十六进制转储时,它怎么\n会是单字节呢? “自动翻译”是否\r\n纯粹基于视图完成,而不是实际针对文本中的字节?

答案1

这个问题在教程中得到了进一步的回答:关闭所有输出处理

事实证明,终端在输出端进行了类似的转换。它将我们打印的每个换行符(“\n”)转换为回车符,后跟换行符(“\r\n”)。终端需要这两个字符才能开始新的文本行。回车符将光标移回当前行的开头,换行符将光标向下移动一行,并在必要时滚动屏幕。 (这两种不同的操作起源于打字机和电传打字机的时代。)

直接回答你的问题,

那么在对文件进行十六进制转储时,\n 为何是单字节呢? “自动翻译”到 \r\n 是否纯粹是在视图的基础上完成的,而不是实际上针对文本中的字节?

是的。当发送到终端时,每个实例都由终端线路规则\n转换为。\r\n您可以使用该标志关闭后处理opost。在 shell 级别,可以通过以下方式进行管理stty

stty -opost    # Turn off "opost" processing
ls             # Notice you get a ladder effect due to there being no CR actions
stty opost     # Restore "opost" processing

如果您打算尝试使用stty,值得了解的是您可以保存当前状态以供以后恢复:

g=$(stty -g)    # Save current state
stty raw        # Interesting times ahead
stty $g         # Follow this with « Ctrl j » rather than « Enter »

如果您使用bash它,则它不会像您预期的那样工作,因为它提供命令行编辑(GNU readline)。放入不同的 shell(例如dash( sh))中才能体现出真正的效果。

相关内容