bash 是否使终端将换行符 (\n) 转换为回车符 (\r)?

bash 是否使终端将换行符 (\n) 转换为回车符 (\r)?

我打开了两个终端,并从下面的终端执行cat从上面的终端读取:

在此输入图像描述

在上面的终端中我输入"Hello World<Enter>Bye",但看起来上面的终端将Enter密钥作为回车符 ( \r) 发送。

那么是否bash更改终端的设置以使其将换行符 ( \n) 转换为回车符 ( \r) 呢?

答案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(输入回车换行翻译)。

相关内容