Заставляет ли bash терминал преобразовывать символ новой строки (\n) в символ возврата каретки (\r)?

Заставляет ли bash терминал преобразовывать символ новой строки (\n) в символ возврата каретки (\r)?

Я открыл два терминала и из терминала ниже выполнил команду catчтения из терминала выше:

введите описание изображения здесь

В терминале выше я набираю "Hello World<Enter>Bye", но, похоже, терминал выше отправил клавишу Enterкак возврат каретки ( \r).

Так нужно ли bashизменить настройки терминала, чтобы он переводил символ новой строки ( \n) в символ возврата каретки ( \r)?

решение1

Bash изменил терминал на "сырой" режим, что означает, что символы typer не обрабатываются никаким образом. Клавиша 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сcoreutilsstty, последний делает меньше (несколько пунктов, но bash INLCRтакже сбрасывает):

      иначе если (STREQ (информация->имя, "сырой") || STREQ (информация->имя, "приготовленный"))
        {
          если ((info->name[0] == 'r' && перевернуто)
              || (info->name[0] == 'c' && !перевернуто))
            {
              /* Режим приготовления. */
              режим->c_iflag |= BRKINT | ИГНПАР | ИСТРИП | МКРНП | ИКСОН;
              режим->c_oflag |= OPOST;
              режим->c_lflag |= ISIG | ИКАНОН;
#если VMIN == VEOF
              режим->c_cc[VEOF] = CEOF;
#endif
#если VTIME == VEOL
              режим->c_cc[VEOL] = CEOL;
#endif
            }
          еще
            {
              /* Необработанный режим. */
              режим->c_iflag = 0;
              режим->c_oflag &= ~OPOST;
              режим->c_lflag &= ~(ISIG | ICANON
#ifdef XCASE
                                 | X-КЕЙС
#endif
                );
              режим->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(ввод перевода возврата каретки на новую строку).

Связанный контент