Какой протокол / стандарт используется терминалами?

25

Мне было интересно, как «GUI» приложения командной строки передается по сети. В большинстве случаев это довольно просто (простой текст / ввод), но иногда это более сложно (aptitude).

Это определяется каким-то стандартом, чтобы каждый мог написать свой собственный терминал и чтобы все реализации терминала вели себя одинаково (цвета, расположение и т. Д.)?

Оливье Лалонд
источник

Ответы:

46

Консольные программы обычно используют curses или одного из его наследников - для создания текстовых пользовательских интерфейсов, о которых вы говорите.

Эти библиотеки используют одну из двух баз данных, называемых termcapи. terminfoЭти базы данных содержат карты, которые сообщают библиотеке, какие коды следует отправлять для получения желаемых действий с большим количеством различных типов терминалов. Подавляющее большинство типов терминалов, которые вы найдете в этих базах данных, не пережили времена реальных терминалов и теперь представляют только исторический интерес.

ANSI Терминалы

Современные эмуляторы терминала Unix³ используют протокол ANSI X3.64 или один из его более поздних вариантов:

  • ANSI X3.64 : стандарт для управления «стеклянными терминалами» - в отличие от телетайпов - он основан на специальных последовательностях символов, которые интерпретирует удаленный терминал. Например, если окно Unix хочет сообщить терминалу, совместимому с ANSI X3.64, переместить курсор в верхний левый угол экрана, оно отправляет символыESC [ 1 ; 1 H. Первые два символа указывают терминалу ожидать последовательность управления, 1 - это строка и столбец, иHэто команда, означающая «переместить курсор» .⁴

    Общая информация: многие компьютерные BBS также использовали коды ANSI. ( Тем не менее , на самом деле.)

  • DEC VT100 : Первым по-настоящему популярным ANSI-совместимым стеклянным терминалом был VT100 корпорации Digital Equipment. Доказав стандарт ANSI де-юре на рынке, он установил стандарт де-факто, который все еще важен сегодня.

    Иногда вы видите, что это называется протоколом VT102, который является более поздней, более дешевой - и, следовательно, более популярной - версией VT100 плюс все доступные встроенные опции расширения.

    Терминальные протоколы DEC представляют собой серию с обратной совместимостью, простирающуюся от первой ANSI-совместимой модели, представленной в 1978 году (VT100), до моделей серии VT500, выпущенных Boundless Technologies после того, как они приобрели терминальный бизнес у DEC в 1995 году. (Boundless является сейчас нет бизнеса, но их терминалы время от времени появляются на рынке подержанных товаров.)

  • xterm : своего рода амальгама ANSI и стандартов VT-что угодно. Всякий раз, когда вы используете эмулятор терминала с графическим интерфейсом, например,xtermили один из его производных, вы также обычно используетеxtermпротокол терминала, как правило, более современныйxterm-colorилидругойxterm-color256вариант.

  • Linux : Консоль Linux также использует расширенный вариант протокола терминала ANSI в том же духе, что иxtermпротоколы. Большинство его расширений связано с различиями между ПК и стеклянным терминалом. Например, на клавиатуре IBM есть несколько клавиш, которые отсутствуют на DEC VT. (Наоборот.)

    Некоторые системы Unix также имеют собственный протокол консольного терминала. Там в scoansiвариант ANSI X3.64 для ШОС Unixes, например.

Типичная программа-эмулятор терминала является чем-то вроде монгрела и точно не эмулирует какую-либо отдельную модель терминала. Он может поддерживать 96% всех escape-последовательностей DEC VT через VT320, но также поддерживает такие расширения, как цвет ANSI (функция VT525) и произвольное количество строк и столбцов. 4% кодов, которые он не понимает, могут не быть пропущены, если ваши программы не нуждаются в этих функциях, даже если вы сказали curses(или что-то еще), что вы хотите, чтобы программы, использующие его, использовали протокол VT320. Такая программа может объявить себя совместимой с VT320, хотя, строго говоря, это не так ».

Не ANSI Терминалы

Есть несколько других примечательных стандартов, с которыми вы все еще иногда сталкиваетесь:

  • Wyse : Один из первых независимых производителей стеклянных терминалов, Wyse начал создавать терминалы в начале 1980-х годов, прежде чем вычислительные системы на рабочих станциях начали вытеснять миникомпьютеры. Хотя терминалы Wyse могли эмулировать VT100 и другие популярные терминальные протоколы, они также имели свои собственные собственные коды.

  • IBM 3270 : Хотя это не совсем тип терминала «Unix», необходимость подключения систем Unix к мэйнфреймам IBM привела к созданию программ эмулятора терминала серии IBM 3270, которые вы все еще можете найти в использовании. Эмуляторы для более позднихтерминалов серии IBM 5250 также довольно распространены и чаще всего используются в наши дни для подключения кмини-компьютерам AS / 400 и System i .

  • Tektronix 4014 : До того, как ПК и рабочие станции в значительной степени смещали стеклянные терминалы и, таким образом, делали растровую графику стандартной функцией, существовали дорогие графические терминалы, которые рисовали графику на экране в ответ на текстовые команды, аналогичные escape-последовательностям, описанным выше. Вероятно, самым популярным из них была серия Tektronix 4010.

    Их было довольно весело использовать. Вы можете написать программу, которая рисует графику, но затем вместо того, чтобы просто запускать ее для рисования на локальном терминале, вы можете перенаправить ее вывод в файл:

    $ ./my4014program > my-neat-graphic
    

    Затем вы можете отправить этот файл кому-то другому, и они могут catего на своем терминале Tek, чтобы увидеть графику без вашей программы. Отчасти прелесть заключалась в том, насколько медленными были эти терминалы при рисовании, поэтому вы могли наблюдать за построением графики в течение нескольких секунд.

Работа с эмуляцией терминала Unix сегодня

Вы можете узнать, какой стандарт терминала вы хотите использовать в библиотеках curses, посмотрев на TERMпеременную окружения:

$ echo $TERM
xterm-color

Когда вы переходите sshв другую систему, TERMпеременная переносится, поэтому удаленный Unix-сервер знает, как связаться с вашим локальным терминалом.

Поскольку многие из этих протоколов являются вариантами ANSI X3.64, и поскольку повсеместные стандарты кодирования символов ASCII и UTF-8 заботятся о многом другом, неверная TERMпеременная обычно не является катастрофической. Вещи, которые имеют тенденцию ломаться, - это расширенные клавиши, такие как Home и Page Up, комбинации клавиш Alt и любые другие, и типографские функции отображения, такие как цвет, жирный шрифт и т. Д.


Примечания:

  1. Чаще всего это няни .

    Есть также прямые конкуренты cursesAPI, такие как S-Lang .

  2. AT & T terminfoбыла объявлена ​​заменой termcapбазы данных BSD , и она была в значительной степени успешной в замене ее, но все еще существуют программы, которые все еще используют старую termcapбазу данных. Это одно из многих различий между BSD и AT & T, которые вы все еще можете найти в современных системах.

    У моего macOS нет /etc/termcap, но он есть /usr/share/terminfo, тогда как стандартная установка FreeBSD противоположна, хотя эти две ОС часто очень похожи на уровне командной строки.

  3. minicom, xterm, mintty, GNOME Terminal , Terminal.app и т.д.

  4. Правильно написанные программы Unix не генерируют эти escape-последовательности напрямую. Вместо этого они используют одну из библиотек, упомянутых выше, указав ей «переместить курсор в положение (1,1)» или что-то в этом роде, и библиотека выдает необходимые управляющие коды терминала на основе TERMнастроек переменной среды. Это позволяет программе работать правильно независимо от типа терминала, на котором вы ее запускаете.

  5. В старых текстовых терминалах было много странных функций, которые не получили широкого применения в программах, поэтому многие популярные программы-эмуляторы терминалов просто не реализуют эти функции. Распространенными упущениями являются поддержка шестизвенной графики и текстовых режимов двойной ширины / двойной высоты.

    Сопровождающий xtermнаписал программу vttestдля тестирования эмуляторов VT-терминалов, таких как xterm. Вы можете запустить его на других эмуляторах терминала, чтобы узнать, какие функции они не поддерживают.

Уоррен Янг
источник