Приемы профессиональной работы в UNIX



         

Глава 05_1 - часть 5


Основной возможностью для модификации является добавление фактической обработки информации о времени. Один из подходов к этому - запросить почасовой тариф времени в момент создания файла проекта (если считать, что вы работаете на таких основаниях). Этот тариф может храниться первым пунктом в файле проекта. Следующие две строки могут быть отведены для "счета по текущему сеансу" и "общего счета" соответственно. Когда подсчет времени работы над проектом отключается, можно проанализировать текущее системное время и начальное время подсчета и затем пересчитать в минуты (для упрощения арифметики) с использованием команды expr (или, возможно, awk). Затем это значение можно умножить на хранимый в файле тариф времени, а результат сохранить в записи о текущем сеансе работы и ДОБАВИТЬ к совокупной общей записи.

ИМЯ: today

today Печать календаря с подсвеченной сегодняшней датой

НАЗНАЧЕНИЕ

Модифицирует вывод утилиты cal для печати сегодняшней даты инверсным цветом.

ФОРМАТ ВЫЗОВА

today

ПРИМЕР ВЫЗОВА

today Печатает календарь на этот месяц с подсвеченной сегодняшней датой

ТЕКСТ ПРОГРАММЫ today

1 : 2 # @(#) today v1.0 Calendar with today highlighted Author: Russ Sage 2а Календарь с подсветкой сегодняшнего дня   4 SYSV=n   6 set `date`   8 if [ "$SYSV" = "y" ] 9 then RVR=`tput smso` 10 BLNK=`tput blink` 11 NORM=`tput rmso` 12 cal ${2} ${6} | sed "s/${3}/${RVR}${BLNK}${3}${NORM} /g" -e "s/^/ /" 13 else RVR="^[[7m" # termcap so 14 NORM="^[[0m" # termcap se 15 cal ${2} ${6} | sed -e "s/ ${3}/ ${RVR}${3}${NORM} /" -e "s/^/ /" 16 fi

ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ

RVR Управляющий символ инверсного отображения для вашего терминала
BLNK Управляющий символ мерцания для вашего терминала, если таковой имеется
NORM Управляющий символ для возврата терминала в обычный режим

ОПИСАНИЕ

Зачем нам нужен today?

Всегда приятно иметь инструментальные средства, предоставляющие нам информацию о нашей среде. Тип информации, который мы здесь рассматриваем - это модифицированный вывод календаря. Стандартная команда cal выводит дни месяца, но не сообщает вам, какой день сегодня. Как мы это узнаем? Мы должны запустить команду date для определения текущего дня. Довольно тривиальная задача, однако наше решение может дать некоторую ценную графику, которая может добавить действительно полезную информацию к календарю.

Для выполнения такой модификации нам необходимо выполнить постобработку результата команды cal. Поскольку не все терминалы обладают одинаковыми возможностями, эта программа должна быть приспособлена к вашей машине.

Что делает today?

Today - это постпроцессор для команды cal, который делает ее результат более информативным и графически наглядным. Выполнение модификации команды cal зависит от того, в какой системе вы работаете. Если вы в системе UNIX System V (версия 2 или старше), то у вас есть утилита terminfo. Terminfo является заменой для файла termcap и поставляется с несколькими утилитами, которые возвращают значения с информацией о ПРИЕМЫ ПРОФЕССИОНАЛЬНОЙ РАБОТЫ В UNIX нальных характеристик. Если ваш компьютер работает не с системой System V, то вам необходимо немного поисследовать тип ваших конкретных терминалов и внести полученные значения в вашу программу.

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

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

Поскольку в пределах командного файла не так легко определить, с какой системой работает ваш компьютер, использована переменная SYSV. Эту переменную можно изменить при помощи редактора, поэтому today может работать в разных системах. Способами выяснения системы могли бы служить программа uname, существование определенных shell-программ в каталоге /bin или какой-нибудь системный файл, содержащий номер версии. По умолчанию переменная SYSV установлена так, чтобы утилита today работала НЕ в системе System V. С этим связано существование фрагмента программы, который нужно изменять вручную.

Как вы можете самостоятельно получить информацию о терминале? Каждый терминал имеет свои специфические особенности. Все терминалы характеризуются в основном файлом описания терминала termcap. В этом файле каждая характеристика дается под своим именем вместе с аппаратным кодом этой функции. Таким образом, мы можем, например, редактором vi заглянуть в termcap и увидеть, как управлять терминалом, на котором мы работаем. Файл termcap сильно зашифрован и загадочен. По данному вопросу не очень много документации, что порождает множество экспериментов и ошибок.

Переменными, которые нас интересуют, являются "so" для выделения информации (инверсный режим) и "se" для завершения выделения (обычный режим), а также режим мерцания, если он есть у вашего терминала.

Termcap, похоже, не содержит информацию о том, как включить режим мерцания, поэтому вам, вероятно, нужно будет для этого посмотреть документацию на терминал. В системе System V (версия 2) команда tput возвращает соответствующее значение.

По умолчанию в today выполнены установки для ANSI терминала, являющегося консольным в системе XENIX. Эти коды были вручную извлечены из файла /etc/termcap и вставлены в текст программы. Если ваши коды отличаются, вы должны выяснить их. Обратите внимание, что в файле /etc/termcap символ ESCAPE представлен как \E. Это не годится для today, и вы должны изменить такое представление на настоящий ESCAPE. Поскольку ESCAPE является символом выхода из режима ввода в редакторе vi, вы должны использовать команду control-V в этом редакторе для ввода управляющих символов. Последовательность control-V вызывает печать символа ^, а ESCAPE - печать символа [. Таким образом, реальная команда входа в инверсный режим в редакторе vi представлена последовательностью ^[[7m. Эта команда включает символы ^[ в качестве ESCAPE и затем обычные символы [7m для изменения режима.

Теперь, когда характеристики терминала учтены, цель утилиты today - выделить текущий день календаря в инверсном виде, а все остальное оставить в обычном виде. Это делается путем передачи по конвейеру выхода команды cal команде sed. Утилита sed находит число в выходных данных и подставляет специальную графическую ESC-последовательность. Поскольку ваш терминал использует специальные символы для изменения режима, вы не увидите их выдачи на экран.

Данная программа не имеет опций или какого-то особого входа. Она распечатывает календарь с отмеченным сегодняшним днем.

ПОЯСНЕНИЯ




Содержание  Назад  Вперед