Консольные программы обычно используют проклятия или одного из ее преемников ¹ для создания видов текстовых пользовательских интерфейсов, о которых Вы говорите.
Эти библиотеки используют одну из двух баз данных, названных termcap
и terminfo
. ² Эти базы данных содержат карты, которые говорят библиотеке, что коды отправить для получения желаемых действий с большим количеством разнообразного терминала вводит. Подавляющее большинство терминала вводит, Вы найдете определенным в этих базах данных, не пережил дни реальных терминалов и так являются теперь только, представляющими исторический интерес.
Современные эмуляторы терминала Unix ³ используют протокол ANSI X3.64 или один из его более поздних вариантов:
ANSI X3.64: стандарт для управления "стеклянными терминалами" — в противоположность телетайпам — это основано на специальных последовательностях символов, которые интерпретирует удаленный терминал. Например, если поле Unix хочет сказать ANSI X3.64 совместимый терминал для перемещения его курсора в левый верхний угол экрана, это отправляет символы ESC
[
1
;
1
H
. Первые два символа говорят терминалу ожидать управляющую последовательность, 1 с строка и столбец, и H
команда, означающая "курсор перемещения". ⁴
Мелочи: многие ПК BBSes использовали коды ANSI, также. (Все еще сделайте на самом деле.)
DEC VT100: первый действительно популярный совместимый с ANSI стеклянный терминал был VT100 Digital Equipment Corporation. Путем доказательства стандарта де-юре ANSI на рынке, это установило фактический стандарт, который все еще важен сегодня.
Иногда Вы видите названный протоколом VT102, при этом тот уменьшенное до стоимости более позднее — и поэтому более популярный — версия VT100 плюс все доступные встроенные опции расширения.
Протоколы терминала DEC являются назад совместимым рядом, расширяющимся из первой совместимой с ANSI модели, представленной в 1978 (VT100) через модели серии VT500, произведенные Boundless Technologies после того, как они купили терминальный бизнес у DEC в 1995. (Boundless теперь банкротом, но их терминалы все еще время от времени открываются на используемом рынке.)
xterm: Своего рода амальгама ANSI и стандартов VT-whatever. Каждый раз, когда Вы используете эмулятор терминала GUI как xterm
или одна из его производных, Вы обычно также используете xterm
терминальный протокол, обычно более современное xterm-color
или xterm-color256
варианты.
Linux: консоль Linux также использует расширенный вариант протокола терминала ANSI в том же духе как xterm
протоколы. Большинство его расширений имеет отношение к различиям между ПК и стеклянным терминалом. Например, клавиатура IBM имеет некоторые ключи не на VT-whatever DEC. (И наоборот.)
Некоторые системы Unix имеют свой собственный консольный протокол терминала, также. Существует scoansi
Вариант ANSI X3.64 для SCO Unixes, например.
Типичная программа эмулятора терминала является чем-то вроде полукровки и не эмулирует единственной терминальной модели точно. Это могло бы поддерживать 96% всех escape-последовательностей VT DEC через VT320, все же также поддерживать расширения как цвет ANSI (функция VT525) и произвольное число строк и столбцов. 4% кодов, которые это не понимает, не могут быть пропущены, если для Ваших программ не нужны те функции, даже при том, что Вы сказали curses
(или безотносительно), что Вы хотите программы с помощью него для использования протокола VT320. Такая программа могла бы рекламировать себя как совместимый VT320, затем, даже при том, что строго говоря это не. ⁵
Существует несколько других известных стандартов, с которыми Вы все еще иногда сталкиваетесь:
Wyse: Один из самых ранних независимых производителей стеклянных терминалов, Wyse начал делать терминалы в начале 1980-х, прежде чем вычисления рабочей станции начали перемещать миникомпьютеры. Хотя терминалы Wyse смогли эмулировать VT100 и другие популярные терминальные протоколы, у них также были свои собственные собственные коды.
IBM 3270: Хотя это не строго тип терминала "Unix", потребность подключить системы Unix к универсальным компьютерам типа IBM, ведомым к созданию серийных программ IBM 3270 эмулятора терминала, которые можно все еще найти используемым. Эмуляторы для более поздних серийных терминалов IBM 5250 также довольно распространены, чаще всего использовал эти дни для соединения с AS/400 и Системой i миникомпьютеров.
Tektronix 4014: Прежде чем ПК и рабочие станции в основном переместили стеклянные терминалы и таким образом сделали растровую графику стандартной функцией, были дорогие графические терминалы, которые потянули графику на экране в ответ на текст, управляет подобный escape-последовательностям, описанным выше. Вероятно, самым популярным из них был ряд Tektronix 4010.
Они были довольно забавны использовать. Вы могли записать программу, которая потянула диаграмму, но затем вместо того, чтобы просто выполнить ее для привлечения локального терминала Вы могли перенаправить его вывод в файл:
$ ./my4014program > my-neat-graphic
Вы могли затем отправить тот файл кому-то еще, и они могли cat
это на их терминале Tek для наблюдения диаграммы, не имея программы. Часть очарования была, насколько медленный эти терминалы были в рисунке, таким образом, Вы могли наблюдать графическую сборку за несколько секунд.
Можно узнать, как какой терминальный стандарт Вы спрашиваете библиотеки curses
использовать путем взгляда на TERM
переменная среды:
$ echo $TERM
xterm-color
Когда Вы ssh
к другой системе, TERM
переменную несут вдоль так удаленного поля Unix, знает, как связаться с Вашим локальным терминалом.
Поскольку столь многие из этих протоколов являются вариантами ANSI X3.64, и потому что повсеместный ASCII и стандарты кодировки символов UTF-8 еще заботятся о так, неправильное TERM
переменная не является обычно катастрофической. Вещами, которые имеют тенденцию повреждаться, являются расширенные ключи как Домашняя и Page Up, сочетания клавиш Alt-whatever и типографские функции дисплея как цвет, полужирный шрифт, и т.д.
Сноски:
Обычно, ncurses.
Существуют также прямые конкуренты curses
API, такой как Сленг.
AT&T провозглашена terminfo
как замена для BSD's termcap
база данных, и это было в основном успешно в замене его, но существуют все еще программы там, которые все еще используют старое termcap
база данных. Это - один из многих BSD по сравнению с различиями AT&T, которые можно все еще найти в современных системах.
Мое macOS поле не имеет /etc/termcap
, но это действительно имеет /usr/share/terminfo
, тогда как стандартная установка FreeBSD является противоположным путем вокруг, даже при том, что эти два Ose часто весьма схожи на уровне командной строки.
minicom
, xterm
, mintty
, Терминал GNOME, Terminal.app, и т.д.
Правильно записанные программы Unix не испускают эти escape-последовательности непосредственно. Вместо этого они пользуются одной из упомянутых выше библиотек, говоря этому "переместить курсор в положение (1,1)" или что бы то ни было, и библиотека испускает необходимые терминальные коды управления на основе Вашего TERM
установка переменной среды. Это позволяет программе работать правильно, какой терминал вводят Вас, работает на нем.
Старые текстовые терминалы имели много странных функций, которые не получили большое использование программами, столько популярных программ эмулятора терминала просто не реализует эти опции. Общий пропуск является поддержкой sixel графики и double-width/double-height текстовых режимов.
Специалист по обслуживанию xterm
записал названную программу vttest
для тестирования эмуляторов терминала VT такой как xterm
. Можно выполнить его против других эмуляторов терминала для обнаружения, какие функции они не поддерживают.
echo {1..5}
расширен в команду echo 1 2 3 4 5
который затем расширен обычным способом. Это нисколько не подобно seq 1 1000000000 >/dev/null
, который никогда не расширяется до команды с очень многими аргументами.
Это больше похоже echo $(seq 1 1000000000)
: Я предполагаю, что это повреждается таким же образом?
Проблема, с которой Вы сталкиваетесь, относится к обработке больших команд, о которых Unix всегда был суетливым, который должен сказать, что это - общая проблема с обработкой командных строк. Это - одна из вещей, которые Perl был записан для фиксации.
Я зарегистрировал бы вежливый и информативный отчет об ошибках так или иначе: это могло бы вызвать интересное обсуждение.
Я предполагаю, что это расширение не разработано, чтобы использоваться тот путь. Катастрофический отказ указывает на ошибку, конечно, но редко инициировал ту.
Как практичный делают Вы думаете, что это должно подать миллиард последовательных целых чисел к чему-нибудь?
seq
непрактичный? это может пойти порядки величины выше... Действительно ли это практично? абсолютно (при необходимости в нем), действительно ли это редко? Я не знаю, но я подозреваю так.. но грузовик на магистрали, которую Вы не видите, также редок, но это довольно важно :)... Однако мне нужен он теперь, и я ищу наилучший вариант... Из-за этой 'целочисленной последовательности' катастрофический отказ, это инициировало более широкий вопрос.. "Что управляет пределами расширения фигурной скобки оболочки?"
– Peter.O
28.02.2011, 09:06
echo $(seq 1 1000000000)
, но Терминал исчез :)... Так, я заключаю, что это не имеет отношения конкретно к такжеecho
или расширение фигурной скобки... и что это - просто вопрос исчерпывания RAM... btw, эта проблема, явилось результатом этого вопроса: unix.stackexchange.com/questions/8273 / … – Peter.O 28.02.2011, 20:02