В наши дни настоящая путаница может возникнуть из-за того, что клиент и сервер использовались MIT при создании среды X Windows.
Вычислительный клиент был большим железным центральным вычислительным центром.
Сервер отображения был вашим относительно дешевым настольным устройством. Он обслуживал дисплей конечному пользователю от имени центрального клиента.
В этой ситуации для сервера отображения имеет смысл выполнять рендеринг, и на самом деле это именно то, что раньше и происходило.
Теперь, конечно, у нас есть «клиент и сервер», и сервер будет центральным вычислительным ресурсом с клиентами, сидящими на рабочих столах людей (или на коленях). Обратите внимание, что терминология изменила свое значение.
Чтобы добавить полной путаницы, типичная рабочая станция на базе Linux будет иметь клиент и сервер на одном устройстве, но с разделением вычислительного клиента и сервера дисплея это может Помогите объяснить, почему существует удобное разделение базовой системы, основанной на командной строке, и графического интерфейса пользователя.
Bash перевел терминал в "сырой" режим, что означает, что символы ввода никак не обрабатываются. Клавиша ввода создает символ возврата каретки (\r), а не символ перевода строки (\n), поэтому перевод не выполняется.
сырой и приготовленный режимы являются описательными терминами. 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
( ввод каретки-возврат к переводу новой строки ).