Компания ALT Linux
Опубликован: 14.12.2004 | Доступ: свободный | Студентов: 12242 / 1449 | Оценка: 4.19 / 3.84 | Длительность: 18:18:00
ISBN: 978-5-9556-0019-1
Лекция 8:

Устройства, терминалы и процессы

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >

Терминалы

Упомянутый выше стандарт - документ, на наш взгляд, несколько однобокий: подробнейшим образом описывая логику передачи информации и поведения терминала в различных ситуациях, он очень мало говорит о логике и способах предъявления ее человеку. Задумывалось это следующим образом: терминал может общаться с пользователем как угодно: быть просто принтером с клавиатурой или довольно хитрым приспособлением, в котором можно подготовить и отредактировать целый блок текста. Стандарт описывает лишь то, как терминал будет общаться с компьютером. В самом деле, терминал системы IBM/370 (в нашей стране прозванный "EC-овским терминалом") как раз и был микрокомпьютером, в котором отдельно от основной системы можно было подготовить целый экран текста, затем нажатием кнопки Send отослать его машине (напоминает пакетный режим обработки заданий: слишком архаичная система IBM/370 плоховато справлялась с интерактивным режимом работы). Когда система "зависала", на этом терминале можно было в ожидании перезапуска даже играть в "змея" - программу, написанную на автокоде самого терминала.

Такой подход к оконечным устройствам оказался слишком дорогостоящим. К тому же производством терминалов занялись люди, довольно далекие от компьютерной отрасли: изготовители печатных машинок. Первые терминалы выпускались для издательских систем, переведенных на цифровой способ работы. Это от механической печатной машинки достались нам символ и клавиша Tab: для набора таблиц имелась специальная рейка с подвижными ползунками-табулостопами; нажатие клавиши Tab приводило к тому, что каретка передвигалась вправо до очередного ползунка. Отсюда же и русское название клавиши Backspace - "забой": поскольку напечатанный на бумаге символ стереть нельзя, для удаления приходилось возвращать каретку на одно знакоместо назад и "забивать" этот символ черным прямоугольником-"марашкой".

Линия, к которой подключен терминал, передает данные последовательно. Последовательно, т. е. один за одним, вводит пользователь символы с клавиатуры. А вот экран терминала, как правило, представляет собой прямоугольник из знакомест (чаще всего - размером 80x24). Этот прямоугольник можно неплохо использовать для усиления наглядности выдачи. Если последовательно вывести на экран ********, * [Ok] * и ********, получится что-то вроде кнопки:

********
* [Ok] *
********

Управляющие символы и последовательности

Вообще, хотелось бы, не отказываясь от идеи последовательной передачи текстовых данных, уметь использовать все пространство экрана в личных целях: "рисовать" кнопки, меню, помещать выдачу в определенное место экрана, выделять символы и т. д. Для этого разными производителями терминалов было (увы, независимо друг от друга) изобретено понятие управляющего символа. Идея в том, что несколько передаваемых на экран терминала символов не отображаются как значки текста, зато, приняв такой символ, терминал что-нибудь делает.

Например, символ ^M (возврат каретки, carriage return) заставляет терминал переместить курсор в начало строки (курсор в терминале аналогичен каретке пишущей машинки: это то место, где будет напечатан следующий символ), а символ ^J (перевод строки, line feed) - переместить курсор на одну строку вниз. С CR и LF происходит немало путаницы. Это, к сожалению, обычное дело, если речь идет о внешнем устройстве под названием "терминал". Однако, если вообразить себе все возможные способности терминала (очистка областей экрана и строки, прокрутка всего экрана и отдельных прямоугольных "окон" внутри него, выделение текста подчеркиванием, яркостью и цветом, смена шрифта и т. д.), становится понятно, что набором из 32 управляющих символов (так в стандарте) обойтись не удастся.

Несколько слов об обозначении управляющих символов. Во-первых, можно указывать способ, которым определенный символ подается с клавиатуры. В документации принято писать ^буква для клавиатурной комбинации Ctrl+буква. При нажатии Ctrl старшие три бита ASCII-кода символа обнуляются, и символ с получившимся кодом передается в терминальную линию. Например, ^[ обозначает Escape (ASCII код 27), что соответствует нажатию клавиши Ctrl и [ (ASCII код 91). Иногда вместо ^буква используются обозначения, принятые в языке Си: универсальное, вида \0восьмеричный_ASCII_код, или специальные, такие как \n (от "newline", он же ^J и \012 ), \t ("tab", ^I и \011 ) или \E ("Escape", ^[ или \033 ).

Итак, на все функции терминала управляющих символов не хватает, и придется подумать об управляющей последовательности: специальный управляющий символ и несколько следующих за ним символов не отображаются на экране, а составляют команду. Тут-то производители печатных машинок вволю поиздевались над стандартами (точнее сказать, думать о них забыли; стандарт ANSI появился в 1979 году, когда было уже слишком поздно). У кого таким спецсимволом установлен Escape ( ^[ ), а у кого - нет. В некоторых терминалах есть управляющая последовательность позиционирования курсора, позволяющая выводить текст в определенное место экрана, а в некоторых - нет. Координаты могут начинаться с нуля, а могут - с единицы. Само собой, у разработчиков каждой модели терминала есть свое понимание того, из чего именно состоит каждая управляющая последовательность. Зачастую терминалы "говорят" на языках, ничем друг на друга не похожих. В лучшем случае управляющая последовательность для одного типа терминалов бессмысленна для другого, в худшем случае - перенастраивает его совершенно недопустимым образом.

Особенно прославился терминал Hazeltine, который считает управляющим обыкновенный текстовый символ ~, поэтому его нельзя на этот терминал выводить просто так. Примитивная последовательность очистки экрана для терминала Wyse 30 выглядит как ^[*, для VT100 - как ^[[2J, а для Hazeltine 1500 - ~^\. Управляющие последовательности называют еще Escape-последовательностями (esc-sequence), потому что чаще всего в них используется именно этот символ.

Между тем сама идея текстового интерфейса развивалась и захватывала все новые области применения, вдобавок к интерфейсу командной строки. Если терминал умеет хотя бы позиционировать курсор (то есть имеет управляющую последовательность, получив которую он переставляет курсор, а с ним и позицию вывода текста в заданное знакоместо экрана), то с помощью этой функции можно попробовать "рисовать" из символов списки, меню, кнопочки и прочие элементы интерфейса, основанного на выборе. В программах вроде Midnight Commander (или его предка - Norton Commander для ДОС) такой подход доказал свою эффективность и применимость для некоторых видов задач.

Для перемещения по текстовому полю весьма желательно использовать клавиши со стрелочками, с надписями Home, Page Up, F1 и т. п. На разных терминалах таких клавиш может быть очень много, а может не быть вообще. Более того, если уж мы отказались от интеллектуальности терминала, интерпретировать нажатие этих клавиш будет сама система. История повторяется: так же, как и выводимые на терминал управляющие последовательности, вводимые с терминала "стрелочки" - на самом деле тоже последовательности специальных символов. И опять каждый изготовитель ладит свое: в каждом виде терминала несимвольная клавиша может возвращать все, что заблагорассудится конструктору. Терминалы Wyse 30, VT100 и Hazeltine 2000 выводят при нажатии на стрелку вверх соответственно ^K, ^[OA и ~^L.

Преодолеть это можно естественным для проективной системы путем: разделить абстракцию и реализацию. Так называемые "умения", или характеристики терминала (terminal capabilities), любой уважающий себя программист должен использовать не напрямую в виде ESC-последовательностей, а косвенно, выбирая их по имени из таблицы характеристик терминалов. Таких таблиц в UNIX имеется два вида. Одна - из гнезда BSD, огромный текстовый файл под названием termcap (исторически он лежит в /etc, однако более правильно помещать его в /usr/share/misc, см. главу 13). Это более старый вариант таблицы характеристик; для быстрого чтения характеристик ее преобразуют иногда в формат BerkleyDB, однако исходный файл всегда текстовый.

Второй вид таблиц характеристик, terminfo, - из гнезда USG. Это целая база данных с нетекстовым форматом полей и специальными инструментами для чтения и записи. Каждому типу терминала соответствует отдельный файл описания, находящийся в подкаталоге /usr/share/lib/terminfo, имя которого соответствует первой букве имени терминала. Для работы с описанием терминала из terminfo необходима специальная библиотека и утилиты (в первую очередь infocmp и tic ), ее использующие.

При появлении на горизонте очередного терминала с новыми прихотливыми возможностями этот терминал описывается в понятиях termcap или terminfo. Программа, работающая с терминалом, может использовать специальную библиотеку (она называется curses ) и работать в прикладных терминах: строки, колонки, окна, рамки и т. п., независимо от типа терминала.

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Andranik Avakian
Andranik Avakian

41. УК РФ и Комментарии (ст. 273)

М. 2000 г. Издательство: ALT Linux, Институт Логики

Уголовный Кодекс РФ и комментарии к нему?

По ссылке открывается сайт документации Linux, раздел Linux Installation and Getting Started

Сергей Петровский
Сергей Петровский

У Вас написано:

ls -dt1 `grep -il отчет *` | head -1

если знания по шелу мне не изменяют, то должно быть:

ls -dt | `grep -il отчет *` | head -1