答案1
Bash 已将终端更改为“原始”模式,这意味着打字机字符不会以任何方式处理。 Enter 键产生回车符 (\r),而不是换行符 (\n),因此不会发生任何转换。
答案2
生的和煮熟的模式是描述性术语。 stty raw
使用与 bash 不同的设置。
Bash 进行终端初始化准备终端设置(readline 库的内部函数),设置终端模式以允许一次读取一个字符而不回显:
tiop->c_lflag &= ~(ICANON | ECHO);
然而,回车翻译被重置为函数的不同部分:
/* Make sure we differentiate between CR and NL on input. */
tiop->c_iflag &= ~(ICRNL | INLCR);
如果你prepare_terminal_settings
比较核心工具stty
,后者的作用较少(有几点,但 bashINLCR
也会重置):
else if (STREQ (信息->名称, "生") || STREQ (信息->名称, "熟")) { if ((info->name[0] == 'r' && 反转) || (信息->名称[0] == 'c' && !反转)) { /* 煮熟模式。 */ 模式->c_iflag |= BRKINT | IGNPAR | ISTRIP | ICRNL |伊克森; 模式->c_oflag |= OPOST; 模式->c_lflag |= ISIG |伊卡农; #如果 VMIN == VEOF 模式->c_cc[VEOF] = CEOF; #万一 #如果 VTIME == VEOL 模式->c_cc[VEOL] = CEOL; #万一 } 别的 { /* 原始模式。 */ 模式->c_iflag = 0; 模式->c_oflag &= ~OPOST; 模式->c_lflag &= ~(ISIG | ICANON #ifdef XCASE | XCASE #万一 ); 模式->c_cc[VMIN] = 1; 模式->c_cc[VTIME] = 0; } }
POSIX 说的stty raw
:
启用(禁用)原始输入和输出。原始模式应等效于设置:
stty cs8 erase ^- kill ^- intr ^- \
quit ^- eof ^- eol ^- -post -inpck
-post
有趣的是(按照和的描述-inpck
)并没有解决输入时的回车转换问题。
由于条款生的和煮熟的(POSIX 或 coreutils stty)与 bash 的功能不对应,提及与其实际功能相对应的 POSIX termios 功能是可行的方法:icrnl
(输入回车换行翻译)。