我跟着这里。
我注意到(这并不完整,仅供演示)此时:
#include <termios.h>
raw.c_iflag &= ~(ICRNL | IXON);
raw.c_oflag &= ~(OPOST);
raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
使它变得像这样:
printf("\n");
只需前进到下一行,而不将光标移动到开头。文本解释说通常\n
会被翻译成\r\n
并OPOST
禁用它。
相关地,该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
))中才能体现出真正的效果。