Брайан Керниган - UNIX — универсальная среда программирования
- Название:UNIX — универсальная среда программирования
- Автор:
- Жанр:
- Издательство:Финансы и статистика
- Год:1992
- Город:Москва
- ISBN:5-289-00253-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Брайан Керниган - UNIX — универсальная среда программирования краткое содержание
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.
Для программистов-пользователей операционной системы UNIX.
UNIX — универсальная среда программирования - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
$ cat doctype
# doctype: synthesize proper command line for troff
echo -n "cat $* | "
egrep -h (EQ|TS|\[|PS|IS|PP)' $* |
sort -u |
awk '
/^\.PP/ { ms++ }
/^\.EQ/ { eqn++ }
/^\.TS/ { tbl++ }
/^\.PS/ { pic++ }
/^\.IS/ { ideal++ }
/^\.\[/ { refer++ }
END {
if (refer > 0) printf "refer | "
if (pic > 0) printf "pic | "
if (ideal > 0) printf "ideal | "
if (tbl > 0) printf "tbl | "
if (eqn > 0) printf "eqn | "
printf "troff "
if (ms > 0) printf "-ms"
printf "\n"
} '
$
(Флаг -h
заставляет ее подавлять заголовки имен файлов на каждой строке: к сожалению, этот аргумент есть не во всех версиях системы.) При сканировании входного потока собирается информация о том, какие компоненты используются. После просмотра входной поток обрабатывается в требуемой последовательности для печати выходного текста. В формировании документов troff
со стандартными препроцессорами есть специфика, и главная задача состоит в том, чтобы заставить "думать" об этом саму машину.
Программа doctype
в нашем примере подобна bundle
-программе, которая создает программу. Однако в таком виде она требует от пользователя вновь вводить строку для shell
. В одном из приводимых ниже упражнений вам предлагается это исправить.
Когда дело дойдет до запуска реальных команд troff
, не забывайте, что поведение программы зависит от системы: на некоторых установках она управляет наборным устройством непосредственно, в то время как на других выдает в стандартный выходной поток информацию, которая должна быть послана на наборное устройство отдельной программой.
Между прочим, в новой версии этой программы не предусмотрена программа egrep
или sort
; awk
сама просматривает весь входной поток. Для больших документов такой вариант оказывается слишком медленным, поэтому для ускорения поиска мы добавили egrep
и затем sort -u
, чтобы избавиться от дублирования. При построении типичных документов накладные расходы по созданию двух дополнительных разбирающих данные процессов меньше, чем запуск awk
в тех же целях с большим объемом входного текста.
В качестве иллюстрации сравним doctype
с версией, только запускающей awk
применительно к содержимому данной главы (около 52 000 символов):
$ time awk '... doctype without egrep ...' ch9.*
cat ch9.1 ch9.2 ch9.3 ch9.4 | pic | tbl | eqn | troff -ms
real 31.0
user 8.9
sys 2.8
$ time doctype ch9*
cat ch9.1 ch9.2 ch9.3 ch9.4 | pic | tbl | eqn | troff -ms
real 7.0
user 1.0
sys 2.3
$
Сравнение, очевидно, в пользу версии с тремя процессами. (Работа была выполнена в однопользовательском режиме; соотношение значений времени показало бы даже более значительное преимущество версии egrep
и при повышенной нагрузке на систему.) Отметим, что, прежде чем начать оптимизацию, мы получили сначала простую работающую версию.
Как мы сформатировали эту главу?
Если вашим ограничителем для eqn
является знак доллара, то как вы получите этот знак в выходном потоке? Подсказка: исследуйте кавычки и предопределенные слова eqn
.
Почему команда
$ doctype имена_файлов
не выполняется? Модифицируйте doctype
так, чтобы запускать команду, полученную в результате, вместо того, чтобы ее печатать.
Важны ли накладные расходы на добавочную команду cat
в doctype
? Перепишите doctype
, чтобы избавиться от дополнительного процесса. Какая версия проще?
Что лучше: использовать doctype
или писать файл shell
, содержащий команды, для форматирования конкретного документа?
Поэкспериментируйте с различными комбинациями grep
, egrep
, fgrep
, sed
, awk
и sort
, чтобы повысить быстродействие doctype.
9.4 Справочник
Основной документацией для команды является обычно справочная страничка (называемая далее справочником) одностраничное описание в справочном руководстве по UNIX (см. рис. 9.2). Справочник хранится в стандартном каталоге, как правило, в /usr/man
, в подкаталоге, нумерованном в соответствии с разделом руководства. Например, наш справочник для hoc
хранится в /usr/man/man1/hoc.1
.
Справочники печатаются с помощью команды man(1)
, т.е. файла shell
, который запускает nroff -man
, поэтому man hoc
печатает справочник hoc
. Если одно и то же имя появляется в нескольких разделах, как само man (раздел 1 описывает команду, тогда как раздел 7 описывает макрокоманды), то раздел можно определить для man
как
$ man 7 man
В результате печатается только описание макрокоманд пакета man
. По умолчанию принято печатать все справочники с определенным именем, использующим nroff
, но man -t
порождает справочники для наборного устройства с помощью troff
.
Автор справочника создает файл в соответствующем подкаталоге /usr/man
. Чтобы печатать справочник, команда man
вызывает nroff
или troff
с пакетом макроопределений; это можно увидеть, отыскав команду man
для вызовов форматирующей программы. Мы получили бы такой результат:
$ grep roff `which man`
nroff $opt -man $all ;;
neqn $all | nroff $opt -man ;;
troff $opt -man $all ;;
troff -t $opt -man $all | tc ;;
eqn $all troff $opt -man ;;
eqn $all troff -t $opt -man | tc ;;
$
Разнообразие достигается применением флагов: nroff
или troff
, запускается или нет eqn
и т.д. Справочник по макрокомандам, вызываемый troff -man
, определяет команды troff
, форматирующие в стиле данного руководства. В принципе они аналогичны макрокомандам ms
, но есть и различия, особенно в установке названия и командах смены шрифта. Макрокоманды кратко документированы в man(7)
, но основные из них легко запоминаются. Разметка справочника такова:
.TH COMMAND номер раздела
.SH NAME
команда \- краткое описание функций
.В команда возможные аргументы
.SH DESCRIPTION
Подробное объяснение команд и флагов.
Абзацы вводятся .PP.
.PP
Это новый абзац.
.SH FILES
Файлы, используемые командой, например, passwd(1)
упоминает /etc/passwd
.SH "SEE ALSO."
Ссылки к связанным документам, включая другие справочники
.SH DIAGNOSTICS
Описание некоторого необычного выходного потока
(например, см. cmp(1))
.SH BUGS
Неожиданные черты (не всегда ошибки; см. ниже)
Если какой-то раздел пуст, его заголовок опускается. Строка. .TH
и разделы NAME
, SYNOPSIS
, DESCRIPTION
не обязательны. Строка
Интервал:
Закладка: