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

Информационное наполнение UNIX

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

Утилита man

Утилита man(1) - составная, ее вызов - это последовательное выполнение трех операций: поиск страницы руководства, форматирование найденной страницы и просмотр отформатированного текста.

Сами страницы помощи - это файлы, имена которых включают имена объектов (об этом будет подробнее рассказано в лекции 13). Файлы расположены в некотором базовом каталоге (например, в /usr/share/man или в /usr/X11R6/share/man ) в подкаталогах man1, man2 и т. д. по количеству разделов. Таким образом, первая стадия работы утилиты man сводится к поиску первой страницы с именем объекта во всех секциях базовых каталогов. Кстати, именно поэтому секция, посвященная администрированию, сделана восьмой: если пользователь вызовет man без указания раздела, то при совпадении имен объектов он получит руководство по утилите, а системному администратору ничего не стоит написать в командной строке man 8.

Во многих системах страницы руководства запакованы программой compress(1) или gzip(1), так что перед форматированием страница распаковывается. Руководства хранятся в формате ROFF. Это специальный язык разметки текста для представления его в виде документа. Первые его версии появились аж в начале 60-х, еще до рождения UNIX, а после его многократно расширяли и совершенствовали разработчики UNIX и GNU (наиболее популярная на сегодня версия этой системы документирования называется GNU roff, или groff(1) ). В отличие от Д. Кнута, автора системы TeX (кстати, абсолютно проективной!) (см. [ 44 ] ), авторы ROFF не имели целью создать язык разметки полноценной книги.

Им нужно было подготовить систему документирования, продукт которой одинаково хорошо смотрелся бы и в полиграфическом исполнении, и на простейшем устройстве вывода текстов (например, алфавитно-цифровом терминале, см. лекцию 8). В ROFF включены все необходимые средства, man использует утилиту nroff, которая форматирует ROFF-документ для выдачи его на алфавитно-цифровое печатающее устройство (или АЦПУ, это что-то вроде электрической печатной машинки с возможностью принимать текстовые данные). Шрифт в АЦПУ один, моноширинный, псевдографики нет. Однако nroff умеет даже на таком устройстве выделять текст повышенной яркостью и подчеркиванием! Чтобы на печати буква выглядела ярче, сразу после нее выводится символ Backspace (возврат печатающей головки на одно знакоместо назад) и буква выводится повторно (в машинописи это называется "двойной удар"). Для подчеркивания текста сначала выводится не сама буква, а символ подчеркивания _.

Третья стадия работы man - вызов утилиты постраничного просмотра текста more(1). Подобие more, лишенное всех функций, кроме главной, можно найти даже в DOS. Во многих современных системах вместо more используется более мощная утилита less(1). Говорят: "Less is more than more". Утилита позволяет просматривать простой текст и текст, выходящий из-под nroff, при этом используются возможности терминала: "двойной удар" превращается в текст повышенной яркости, а подчеркивание - в подчеркнутый. (В системе Solaris man почему-то вызывает more с ключом, запрещающим обрабатывать подчеркнутый текст, отчего внешний вид руководства ухудшается. Исходные тексты утилиты more в Solaris недоступны, и приходится подменять ее командным сценарием, в котором параметры командной строки передаются настоящей утилите more уже поправленными.) Если вы хотите вывести руководство на печать, причем не на АЦПУ, а на современный PostScript-принтер, лучше не обрабатывать выдачу man , а воспользоваться предназначенной для этого утилитой troff(1). Получившаяся командная строка может быть, например, такой:

zcat /usr/share/man/man1/man.1.gz | 
    troff -man -Tps | grops | lpr

Для каждой из этих утилит есть руководство, а о том, что такое " | " ("конвейер"), рассказано в лекции 11.

Утилиты whatis и apropos

Самая краткая часть страницы руководства - однострочное поле NAME - тоже играет очень важную роль в системе информационной поддержки. Дело в том, что при установке руководства в систему содержимое этого поля добавляется в файл whatis , лежащий в базовом каталоге. Текстовый файл whatis - оглавление всей системы руководств, находящейся в соответствующем каталоге. Если поискать некоторое слово в этом файле, мы увидим только те заголовки руководств, в которых оно встречается. Поиском ключевых слов в whatis занимаются утилита whatis(1) и apropos(1), которая ищет не целое слово, а просто подстроку в строке.

Вообще говоря, в поле, формирующее поиск, надо было бы складывать ключевые слова. Но ключевые слова (в чистом виде) - информация не для человека, а для машины, а с другой стороны, толковое и внятное краткое описание будет содержать как раз ключевые слова (только не все, в первую очередь - без синонимов). Поэтому, чтобы не нарушать У (правило human writeable), для поиска используется поле NAME . Работоспособной такая система будет при строгом соблюдении О: только поместив в это поле значимый текст, а не что попало, мы можем рассчитывать, что пользователь, если потребуется, найдет наше руководство. Поле NAME вместе с полем SEE ALSO задают довольно простой, но эффективный алгоритм работы с manpages.

Работа с руководствами

Допустим, мы хотим слить два файла, left и right, в один, состоящий из двух колонок (содержимое одного файла - слева, другого - справа). Спрашиваем, в описании каких утилит есть слово column:

$ apropos column
...

Команда apropos выдает несколько сотен строк, относящихся в основном, к графическим функциям (секция 3). Нас же интересует утилита (секция 1). Используем grep(1), чтобы выбрать только строки, содержащие (1) ( поле NAME начинается с контекстной ссылки на само руководство).

$ apropos column | grep "(1)"
colrm(1)    - remove columns from a file
column(1)   - columnate lists

Другое дело! Наверное, нам нужна утилита column? Читаем руководство.

$ man column
...

Не тут-то было... Смотрим поле SEE ALSO

$ man column | colcrt | sed -n '/SEE ALSO/,/^$/p'
SEE ALSO
    colrm(1), ls(1), paste(1), sort(1)

(В примере за нас все сделал UNIX. Как именно? Читайте руководство по colcrt и главу 14). Из полученного списка на подозрении одна только команда paste

$ whatis paste
paste(1)    - merge corresponding or subsequent lines of files

Точно! Читаем руководство.

$ man paste
...

Вот и результат:

$ paste left right
< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Сергей Петровский
Сергей Петровский

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

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

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

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

Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Марина Дайнеко
Марина Дайнеко
Россия, Moscow, Nope, 2008
Тарас Конюков
Тарас Конюков
Россия