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

В наши дни настоящая путаница может возникнуть из-за того, что клиент и сервер использовались MIT при создании среды X Windows.

Вычислительный клиент был большим железным центральным вычислительным центром.

Сервер отображения был вашим относительно дешевым настольным устройством. Он обслуживал дисплей конечному пользователю от имени центрального клиента.

В этой ситуации для сервера отображения имеет смысл выполнять рендеринг, и на самом деле это именно то, что раньше и происходило.

Теперь, конечно, у нас есть «клиент и сервер», и сервер будет центральным вычислительным ресурсом с клиентами, сидящими на рабочих столах людей (или на коленях). Обратите внимание, что терминология изменила свое значение.

Чтобы добавить полной путаницы, типичная рабочая станция на базе Linux будет иметь клиент и сервер на одном устройстве, но с разделением вычислительного клиента и сервера дисплея это может Помогите объяснить, почему существует удобное разделение базовой системы, основанной на командной строке, и графического интерфейса пользователя.

2
24.05.2017, 01:05
2 ответа

Bash перевел терминал в "сырой" режим, что означает, что символы ввода никак не обрабатываются. Клавиша ввода создает символ возврата каретки (\r), а не символ перевода строки (\n), поэтому перевод не выполняется.

4
27.01.2020, 21:56

сырой и приготовленный режимы являются описательными терминами. stty raw использует другие настройки, чем bash.

Bash выполняет инициализацию терминала в prepare_terminal_settings (внутренняя функция библиотеки readline), устанавливая режим терминала, позволяющий читать по одному символу за раз без эха:

  tiop->c_lflag &= ~(ICANON | ECHO);

однако возврат каретки перевод сбрасывается в другой части функции:

  /* Make sure we differentiate between CR and NL on input. */
  tiop->c_iflag &= ~(ICRNL | INLCR);

Если сравнить prepare_terminal_settings с coreutils stty , последний делает меньше (на несколько точек, но bash также сбрасывает INLCR):

      else if (STREQ (info->name, "raw") || STREQ (info->name, "cooked"))
        {
          if ((info->name[0] == 'r' && reversed)
              || (info->name[0] == 'c' && !reversed))
            {
              /* Cooked mode. */
              mode->c_iflag |= BRKINT | IGNPAR | ISTRIP | ICRNL | IXON;
              mode->c_oflag |= OPOST;
              mode->c_lflag |= ISIG | ICANON;
#if VMIN == VEOF
              mode->c_cc[VEOF] = CEOF;
#endif
#if VTIME == VEOL
              mode->c_cc[VEOL] = CEOL;
#endif
            }
          else
            {
              /* Raw mode. */
              mode->c_iflag = 0;
              mode->c_oflag &= ~OPOST;
              mode->c_lflag &= ~(ISIG | ICANON
#ifdef XCASE
                                 | XCASE
#endif
                );
              mode->c_cc[VMIN] = 1;
              mode->c_cc[VTIME] = 0;
            }
        }

POSIX говорит о stty raw :

Включить (отключить) необработанный ввод и вывод. Необработанный режим должен быть эквивалентен настройке:

stty cs8 erase ^- kill ^- intr ^- \
    quit ^- eof ^- eol ^- -post -inpck

, что достаточно интересно (следуя описаниям -post и -inpck) не обращается к переводу возврата каретки при вводе.

Поскольку термины raw и cooked (либо POSIX, либо coreutils stty) не соответствуют тому, что делает bash, упоминание функций termios POSIX, которые соответствуют тому, что он на самом деле делает, является путь: icrnl ( ввод каретки-возврат к переводу новой строки ).

2
27.01.2020, 21:56

Теги

Похожие вопросы