![bash 是否使终端将换行符 (\n) 转换为回车符 (\r)?](https://linux22.com/image/111971/bash%20%E6%98%AF%E5%90%A6%E4%BD%BF%E7%BB%88%E7%AB%AF%E5%B0%86%E6%8D%A2%E8%A1%8C%E7%AC%A6%20(%5Cn)%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%9B%9E%E8%BD%A6%E7%AC%A6%20(%5Cr)%EF%BC%9F.png)
答案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
(输入回车换行翻译)。