Жанр: Учеба
Приемы профессиональной работы в Unix
...жны быть
самым первым аргументом. Это создает более строгий синтаксис, по которому
можно выловить ошибку. Но это несколько ограничивает гибкость.
Как было ранее отмечено, вы можете, если хотите, по-своему разрешить
компромисс между эффективностью и гибкостью путем дополнительного
программирования.
В строке 4 проверяется, включены ли какие-либо параметры. Если
параметры есть, то они обрабатываются. Если не используются никакие
параметры, ничего не делается и управление передается на строку 27.
Если были использованы какие-либо аргументы и первым символом является
знак минуса (-), то выполняется оператор case для определения
того, какой тип файла указан. Переменная KIND устанавливается в соответствии
с типом файла, и данный параметр удаляется из командной строки
командой shift. Если аргумент не совпадает ни с одной из допустимых
опций, то ему соответствует случай *, что означает ошибку. На стандартное
устройство регистрации ошибок выводится соответствующее сообщение
об ошибке и синтаксическая подсказка, после этого kind завершается
с плохим статусом выполнения.
В строке 27 производится проверка того, установлена переменная
KIND или равна нулю. Если она равна нулю, в нее подставляется символьная
строка "text". Если KIND уже установлена, то она не меняется. Это
неплохой оператор присвоения значения по умолчанию. Таким образом,
пользователь не обязан указывать опцию -t в командной строке. Если же
опция -t была указана, то ей есть что сопоставить в операторе case.
Оставшаяся часть программы в строках 29-35 представляет собой еще
один оператор case, который проверяет количество аргументов, оставшихся
в командной строке после обработки ошибок. Если была указана какая-либо
опция, то переменная KIND установлена и опция убрана командой
shift. В командной строке могли остаться только аргументы, которые являются
именами файлов или маршрутами. Если к тому времени, когда мы
уже готовы к заключительной обработке, не осталось никаких аргументов,
то значит в командной строке не было указано ни одного имени файла.
В этом случае в строках 30-33 организовывается цикл, который читает
имена файлов из стандартного ввода, запускает команду file и
использует команду fgrep для определения того, соответствует ли тип
файла, выданный командой file, интересующему нас типу (хранимому в переменной
KIND). Затем мы используем команду cut для выделения того,
что нам нужно. Обычный вывод команды file содержит имя файла, двоеточие
и затем описание. Нам нужно только имя файла, поэтому мы вырезаем
первое поле, используя разделитель ":". Когда никакие данные больше не
поступают, цикл while завершается, мы попадаем в конец оператора case
и выходим из программы.
Если же аргументы НАЙДЕНЫ в командной строке, то вместо всего
этого выполняется ветвь оператора case в строке 34. С помощью обозначения
$@, имена всех файлов в командной строке включены в команду
file. Таким образом, не нужен никакой цикл. Во всем остальном обработка
идентична строке 32.
ВОЗМОЖНЫЕ МОДИФИКАЦИИ
Было бы неплохо, если бы командный файл kind мог работать одновременно
с разными типами файлов. Это означает наличие несколько опций
в командной строке, например -a и -d. Вам могла бы понадобиться
составная строка, в которой каждая часть была бы отделена символом |.
Затем эта строка могла бы быть использована в команде egrep, например,
"egrep 'archive|data'". Вам пришлось бы организовать цикл по командной
строке вместо использования фиксированных позиций и убедиться в том,
что вы не получите зациклившийся конвейер, когда задана только одна
опция.
2.2.4. m - простой доступ к команде more
---------------------------------------------------------------------------
ИМЯ: m
---------------------------------------------------------------------------
m Простой доступ к команде more
НАЗНАЧЕНИЕ
Обеспечивает быстрый и простой способ постраничного вывода
ФОРМАТ ВЫЗОВА
m [more options] [file ...]
ПРИМЕР ВЫЗОВА
m * Вывод командой more всех файлов текущего каталога
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) m v1.0 Easy access to more
2а Простой доступ к команде more
4 /usr/bin/more $@
ОПИСАНИЕ
ЗАЧЕМ НУЖЕН КОМАНДНЫЙ ФАЙЛ m?
Система UNIX сильно загромождается по мере своего функционирования.
В ней обычно имеется множество текстов и данных. Просмотр громадного
количества данных требует многократного нажатия на клавиши, если
вы должны вручную управлять постраничным выводом или периодически вызывать
команду more. Нам необходимы программные средства, которые помогут
нам ускорить эту работу. Одним из таких средств является m. Оно
очень короткое и простое, но это не значит, что оно бесполезно.
Имеется два основных способа вывода данных на экран. Первый
способ - непосредственный вызов команды, например, "more datafile". Вы
направляете данные на экран самой командой. Второй способ - использовать
какую-нибудь команду для получения данных, а затем в конце перехватить
их командой more, например "od -c . | more". В обоих этих случаях
мы вводим с клавиатуры много символов. Сделав так, чтобы команда
more вызывалась по одному символу, мы могли бы уменьшить последние две
команды на шесть нажатий на клавиши. За целый день это хоть немного
предохранит клавиатуру от разрушения! (Если ваша система поддерживает
вызов команд по псевдонимам (aliasing), то, как указывалось ранее, вы
могли бы использовать в этом случае команду alias: "alias m more".)
ЧТО ДЕЛАЕТ m?
Надеемся, все ваши системы имеют команду more или хотя бы ее замену.
Постраничный вывод имеет важное значение при работе с текстом
большого объема.
Все опции и аргументы передаются в командной строке. Вы можете
указать опции команды more в командной строке команды m. Они передаются
без изменений. Можно указать имена файлов. Если они указаны, команда
more выводит их. В противном случае ожидается поступление данных
со стандартного ввода. Таким образом, m может быть использована в качестве
"перехватчика" или как фильтр, как и команда more.
Для тех, кто не слишком знаком с опциями команды more, отметим,
что существуют две изящные возможности: 1) вход в редактор vi в том
месте, где находится курсор при выводе командой more; 2) выход из more
для запуска команды shell и возврат в то место, откуда вы вышли. Первая
опция выполняется при нажатии клавиши "v" в строке состояния команды
more. (То есть когда more отобразила полный экран текста и ждет
продолжения.) Вторая опция запускается при вводе ":!cmd" или "!cmd".
Когда команда выполнится, more вернется в то же место. Как видите, это
синтаксис командной строки ex. Команда more в самом деле имеет небольшую
часть редактора ex, спрятанную внутри нее. Вы можете выполнить
многие команды редактора, указывая их после подсказки в строке состояния
команды more.
Обычный сеанс работы выглядит так:
---------------------------------------------------------------------------
|
| m `path termcap` "-поиск таблицы описания тер|
минала (termcap) и вывод
| . ее командой more
--More--(5%) "-строка состояния more
v vi /etc/termcap
vi +210 /etc/termcap "-командная строка для редак-
тора vi получена от more
:q "-выход из vi
--More--(5%) "-возврат в more
:!sh порождение нового shell'а
$ date запуск команды date
Wed Apr 23 07:15:04 PST 1986
$ ^d "-убрать порожденный shell
--More--(5%) "-возврат в more
:f распечатка имени файла,
выводимого командой more
"/etc/termcap" line 54 выход команды f
--More--(5%)
f "-команда more для пропуска
полного экрана
.skipping 23 lines
--More--(9%) "-пропуск и выдача текста
q выход из команды more
ПРИМЕРЫ
1. $ ll -R / | m
Начиная с корневого каталога (/), вывести в длинном формате (ll)
все файлы (опция -a подразумевается в ll) всей системы (-R) и постранично
распечатать на экран (| m).
2. $ m `path inittab rc passwd`
Обнаружить и вывести с помощью more системные файлы inittab, rc и
passwd. Неприятность здесь заключается в том, что данный маршрут скорее
всего относится к каталогу /bin/passwd, а не /etc/passwd (поскольку
каталог /etc размещается в конце каталогов), а это означает, что вы
можете попытаться вывести на экран исполняемый файл. В зависимости от
того, какую из версий команды more вы запустили, это может привести к
чему угодно начиная с сообщения команды more о том, что это был не
текстовый файл, и заканчивая тем, что ваш терминал начнет показывать
непонятные символы и даже зависнет.
ПОЯСНЕНИЯ
Поскольку в этом командном файле не так много текста, то все довольно
понятно, нет ни обработки ошибок, ни других дополнений. Просто
нехитрый вызов команды more. Полное имя здесь указано с целью повышения
быстродействия, как мы обсуждали ранее. Вы должны перепроверить
местонахождение вашей команды more. В системе Berkeley она может находиться
в каталоге /usr/ ucb/more. Воспользуйтесь командой path more
для определения этого места и вставьте соответствующий маршрут вместо
указанного нами.
Кстати, фокус попадания этой символьной строки в текст вашего командного
файла состоит в том, чтобы войти в редактор и вызвать следующую
команду:
:.!path more
Здесь происходит переход в shell и запуск команды path (:!), затем
выход команды path (который представляет собой полное маршрутное
имя) помещается в буфер редактора в самом начале текущей строки (.).
После этого вы имеете эти данные в вашем редактируемом файле и при необходимости
можете отредактировать их.
2.2.5. mmm - обработка программой nroff макрокоманд для рукописей
---------------------------------------------------------------------------
ИМЯ: mmm
---------------------------------------------------------------------------
mmm Командная строка nroff для макросов обработки
рукописей
НАЗНАЧЕНИЕ
Вызывает текстовый процессор nroff со специальными опциями, которые
инициализируют макросы обработки рукописей.
ФОРМАТ ВЫЗОВА
mmm file [...]
ПРИМЕР ВЫЗОВА
mmm memo Обработать с помощью nroff файл моих заметок
memo и отобразить его на экран
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) mmm v1.0 Nroff command line with mm macros Author: Russ Sage
2а Командная строка nroff с макросами mm
4 if [ "$#" -eq 0 ]
5 then echo "mmm: wrong arg count" "&2
6 echo "usage: mmm file [...]" "&2
7 exit 1
8 fi
10 LIST=""
11 for ARG in $*
12 do
13 if [ ! -f $ARG ]
14 then echo "mmm: $ARG is not a regular file" "&2
15 else LIST="$LIST $ARG"
16 fi
17 done
19 nroff -r0O -mm $LIST
ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
ARG Содержит каждый позиционный параметр командной
строки
LIST Содержит список проверяемых имен файлов
ОПИСАНИЕ
ЗАЧЕМ НУЖЕН КОМАНДНЫЙ ФАЙЛ mmm?
Одним из фактов делового мира является работа с бумагами. Мы производим
заметки, письма, контракты, документы, руководства и так далее.
Если вы знакомы со стилем производства документации в системе
UNIX, то ваши текстовые файлы в основном представлены в одном из форматов
программы nroff.
Однако различные программы форматирования текстов служат различным
целям. Имеется стандартный nroff и nroffс дополнениями, такими
как макросы ms и mm. Для подготовки графической информации и выполнения
типографских работ разработана программа troff. Система AT&T имеет
целую программную среду под названием Writers Workbench, и система
Berkeley имеет аналогичные возможности.
Большинство наших задач по написанию каких-либо текстов может
быть сведено к нескольким стандартным форматам, таким как письма, рукописи
вообще, страницы руководств и так далее. Не так легко запомнить
опции команды nroff (или другой команды), которые следует использовать
в данном случае, да мы и не должны делать это. Наша команда mmm служит
иллюстрацией программы, которую мы можем запускать всякий раз, когда
нам нужен определенный формат. Вы можете создать несколько версий
программы, которые удовлетворяют вашим собственным нуждам при написании
текстов.
Использование заготовленных заранее команд означает, что мы можем
делать полезную работу, даже если некоторое время мы не выполняли работу
определенного вида. Мы также можем избежать многократных нажатий
на клавиши. Мастера UNIX'а периодически уединяются в своих горных убежищах,
где штудируют справочные руководства в поисках полезных, но
доселе незамеченных опций, которые могут быть встроены в программные
средства для повседневной работы. Если слишком некритично полагаться
на ваш текущий набор инструментальных средств, то можно пропустить полезные
возможности.
ЧТО ДЕЛАЕТ mmm?
Командный файл mmm - это интерфейсный процессор для команды
nroff. Под словом "интерфейсный" мы подразумеваем, что он обрабатывает
вызывающую командную строку и устанавливает все опции для вызова программы
nroff. Некоторые из опций nroff жестко запрограммированы в вызове.
Эти опции инициализируют отдельные части программы nroff.
Если вы не включаете никакие аргументы, mmm распознает это как
ошибку и выводит синтаксическую подсказку. Обратите внимание, что если
вы передадите mmm такой аргумент, как -z, то этот аргумент будет
рассматриваться как имя файла, а не как подлежащая передаче опция, и
это снова вызовет ошибку. Вторая ошибка не является фатальной, в то
время как первая фатальна.
После обработки всех аргументов программа nroff использует имена
файлов в качестве файлов с входными данными. По умолчанию вывод производится
в stdout (стандартный вывод). Обычно это экран вашего терминала,
но вывод может быть переадресован или передан по конвейеру на устройство
печати или куда-либо еще.
ПРИМЕРЫ
1. $ mmm nroffile | m
Запуск команды nroff применительно к файлу nroffile, вывод результата
на экран с передачей по конвейеру команде more. Это полезно
при изучении утилиты nroff, проведении экспериментов с различными командами
и наблюдения за соответствующими результатами.
2. $ for F in proj.?
do
mmm $F " $F.rf
done
Обработка в цикле всех файлов, имена которых содержат символьную
строку "proj.", за которой следует один символ. Это могут быть proj.1,
proj.2 и так далее по всему набору символов вплоть до proj.z, proj.{,
proj.|, proj.} и proj.~, если считать, что у вас есть файлы, имена которых
содержат эти символы. Каждый файл обрабатывается, и выход nroff
перенаправляется в файл с таким же именем, дополненным символами .rf.
3. $ mmm status[12] | lpr -o5
Обработка командой nroff файлов status1 и status2. Выход в стандартный
вывод передается по конвейеру программе lpr. Программа lpr является
фильтром и принимает или имена файлов в командной строке, или
непосредственно данные, передаваемые ей по конвейеру (но не то и другое
сразу). Опция -o5 указывает lpr сместить страницу на 5 символов.
ПОЯСНЕНИЯ
В строке 4 проверяется, равно ли нулю количество аргументов в командной
строке. Если да, в стандартный файл ошибок выдается сообщение
об ошибке. Выводится также синтаксическая подсказка, и mmm завершается
с плохим статусом.
Переменная LIST инициализируется нулевым значением в строке 10.
Обычно переменные интерпретатора shell и так в начале равны нулю, но
предварительная установка значения является хорошим стилем программирования.
Затем мы обрабатываем каждый аргумент командной строки в цикле
(строки 11-17). Все аргументы должны быть именами файлов, поэтому каждый
из них проверяется на то, существует ли он как обычный файл. Если
это не файл, то в стандартный файл ошибок выводится сообщение об ошибке.
Тем не менее программа не завершается. Не следует аварийно прекращать
всю программу только потому, что нет указанного файла. Мы пропускаем
его и идем до конца списка аргументов. Это особенно актуально,
если данная команда используется как фоновая во время выполнения другой
работы. Пользователь скорее согласится с тем, чтобы было выполнено
побольше работы, чем не сделано вообще ничего. Это решение, принятое в
данной программе, и вы можете изменить его, если оно не подходит в вашей
ситуации.
Если имени соответствует допустимый файл, оно добавляется в
список хороших имен файлов. Этот список становится главным списком для
команды nroff.
После того как все аргументы проверены, мы в строке 9 строим и
выполняем командную строку nroff.
Опция -rO0 для nroff указывает макросам обработки рукописей (пакету
mm) установить регистр, который имеет дело с отступом текста, в
состояние, соответствующее отступу в 0 символов. Это значит, что весь
текст начинается с крайней левой позиции, т.е. выровнен слева. Путем
проведения экспериментов я обнаружил, что левое выравнивание текста
программой nroff и установка отступа для принтера дает наиболее надежный
вывод на печать. В противном случае, если вы установите отступ
текста в nroff и отступ в принтере, то может произойти настоящее столкновение,
когда дело коснется вывода колонок в странице. Вы можете изменить
это место, если ваши программы вывода или устройства печати ведут
себя как-то иначе. Опция -mm указывает программе nroff просмотреть
библиотеку макросов обработки рукописей, чтобы определить, используются
ли какие-либо из них во входном документе. Эти макросы очень
большие и требуют много времени центрального процессора. Если вам необходимо
использовать их, то вам потребуется большой компьютер или
компьютер, специально предназначенный для этой цели, чтобы добиться
хорошего времени получения результата.
Последним аргументом является $LIST. В этой переменной находится
строка имен файлов, разделенных пробелами. Эти имена помещаются в командную
строку nroff. Можете быть уверенными, что в этом месте нет никаких
ошибок.
ВОЗМОЖНЫЕ МОДИФИКАЦИИ
Поскольку все аргументы рассматриваются как имена файлов, то у
нас нет способа передачи дополнительных команд пакету mm. Наличие такой
возможности было бы желательным, поскольку при экспериментировании
с командой nroff вам необходимо пробовать различные опции, чтобы увидеть,
как они действуют. Было бы тяжелой работой выполнять редактирование
текста mmm, чтобы добавить одноразовые опции, которые могут вам
никогда не понадобиться или опции, которые вы должны постоянно менять.
Один из путей достижения большей гибкости - посмотреть, имеет ли
какой-либо аргумент дефис в качестве первого символа. Если да, перехватить
эту опцию и убрать ее из списка имен файлов. После этого вы бы
имели список опций, которые нужно включить в командную строку, и
список имен файлов, подлежащих обработке.
Отметим, что место, занятое в нашем командном файле указанием пакета
mm, можно вместо этого заполнить ссылкой на другие макропакеты,
имеющиеся в вашей системе, например -ms или -me, в зависимости от нужного
вам формата. Отказ от поиска макросов, которые вам не нужны,
ускорит обработку: подробности вы найдете в документации по nroff или
troff.
2.2.6. pall - печать всех файлов в дереве
---------------------------------------------------------------------------
ИМЯ: pall
---------------------------------------------------------------------------
pall Распечатка всех файлов в дереве каталогов
НАЗНАЧЕНИЕ
Находит все файлы в заданном каталоге в соответствии с некоторым
критерием, разбивает файлы на страницы и помещает результат в один
файл, готовый к распечатке на принтере.
ФОРМАТ ВЫЗОВА
pall [-t|-d] directory
ПРИМЕР ВЫЗОВА
pall /usr/lib
Выводит на печать постранично все текстовые файлы в каталоге
/usr/lib
ТЕКСТ ПРОГРАММЫ
1. :
2 # @(#) pall v1.0 Print all files in a tree Author: Russ Sage
2а Печатает все файлы в дереве
4 if [ $# -eq 0 -o $# -gt 2 ]
5 then echo "pall: wrong argument count" "&2
6 echo "usage: pall [-t|-d] dir" "&2
7 echo " -t text (default)" "&2
8 echo " -d dev (.c,.h,.mk,.s)" "&2
9 exit 1
10 fi
12 NAME=""
13 if [ `echo $1 | cut -c1` = "-" ]
14 then case $1 in
15 -t) NAME=""
16 shift;;
17 -d) NAME="-name \"*.[chms]*\""
18 shift;;
19 *) echo "pall: invalid arg $1" "&2
20 echo "usage: pall [-t|-d] dir" "&2
21 echo " -t text (default)" "&2
22 echo " -d dev (.c,.h,.mk,.s)" "&2
23 exit 1;;
24 esac
25 fi
27 echo "creating output file: /tmp/lpr$$"
29 eval find $1 -type f $NAME -print | sort | while read FILE
30 do
31 if file $FILE |
32 egrep 'exec|data|empty|reloc|cannot open' "/dev/null 2"&1
33 then continue
34 else file $FILE " /dev/tty
35 pr $FILE
36 fi
37 done "" /tmp/lpr$$
39 echo "\nSend /tmp/lpr$$ to line printer (y/n): \c"
40 read CMD
41 if [ "$CMD" = "y" ]
42 then lpr /tmp/lpr$$
43 fi
ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
FILE Содержит имя каждого файла, который должен быть
обработан в цикле while
NAME Содержит строку поиска для определения местона-
хождения указанных файлов
CMD Содержит команду выдачи результатов на принтер
ОПИСАНИЕ
ЗАЧЕМ НУЖЕН КОМАНДНЫЙ ФАЙЛ pall?
Эта утилита объединяет концепции обхода дерева файлов и вывода
содержимого файлов. Даже когда файлы упрятаны в подкаталогах, мы все
равно хотим найти их. Нам необходима для этого утилита, которая обходит
древовидную структуру файлов, находит файлы нужного нам типа, готовит
их к распечатке и ставит в очередь для вывода на принтер.
Такого рода утилита особенно полезна, если исходные тексты или
файлы с документацией хранятся в иерархическом дереве. Дело осложняется
тем, что обычно эти текстовые файлы смешаны с исполняемыми файлами
(откомпилированными программами), файлами данных и, возможно, с архивными
файлами. Необходимо иметь возможность отфильтровать все непригодные
для печати файлы и подготовить текстовые файлы. Должны быть
проверены все файлы с тем, чтобы ни один не был пропущен.
Для выполнения всего этого процесса вручную требуется, чтобы вы
по команде cd переходили в каждый уровень дерева файлов, находили
текстовые файлы, обрабатывали их (обычно командой pr системы UNIX или
каким-либо другим текстовым процессором) и распечатывали их. После выполнения
всей этой работы вы еще должны собрать все отдельные распечатки
вместе в строго определенном порядке. Это большая работа, подверженная
ошибкам со стороны человека. Почему бы не позволить машине
выполнять эту работу? Сейчас мы имеем концепции и средства, необходимые
для создания такой утилиты.
В дополнение к возможности управления файлами, pall также может
управлять устройством печати. Обычно каждое задание, поставленное в
очередь на выполнение к принтеру, имеет заголовок, который печатается
первым. Это значит, что если вы поставили в очередь на печать десять
отдельных заданий, то впереди каждого из них будет две-три страницы,
которые должны быть убраны вручную. Помножьте это на сотни файлов, и
вы будете иметь кучу бумаг, которые должны быть выброшены.
Pall исключает эти потери, поскольку все обработанные данные собираются
в один большой текстовый файл. Когда вся обработка выполнена,
этот один файл может быть поставлен в очередь на печать или сохранен
для некоторых других целей. Единственное ограничение при таком подходе
заключается в максимальном размере файла, который вы можете создать.
Этот размер вычисляется умножением значения ulimit на размер блока.
Например, мое значение ulimit равно 4096. Размер блока в данном случае
равен 512, а не 1024. Максимальный размер файла равен 2097152. Вы можете
вычислить это прямо с клавиатуры, как показано ниже:
$ ulimit
4096
$ expr 4096 \* 512
Этого значения достаточно для большинства случаев.
ЧТО ДЕЛАЕТ pall?
Командный файл pall предназначен для поиска указанных файлов, обработки
их командой UNIX pr и сборки всех результатов в один файл.
После того как все исходные файлы будут обработаны командой pr, вам
будет задан вопрос о том, хотите ли вы поставить выводной файл в очередь
на печать к принтеру. Результирующий файл сохраняется в каталоге
/tmp, где его можно использовать для других целей или удалить.
Опциями pall являются -t и -d. Опция -t используется по умолчанию
и нет необходимости ее указывать. Она предназначена для документации и
указана в командной строке, чтобы более ясно показать действие, которое
будет выполнено.
Если выбрана текстовая опция, ищутся все файлы в древовидной
структуре и затем отбираются только текстовые файлы. Если указана опция
разработки -d (development), то ищутся только файлы, связанные с
разработкой программ. Затем эти файлы отфильтровываются с целью получения
текстовых файлов. Считается, что к разработке программ относятся
файлы, имена которых имеют вид *.c для исходных файлов на языке Си,
*.h для включаемых файлов заголовков, *.mk для файлов построения программ
(makefiles) и *.s для исходных файлов на ассемблере. Если требуются
какие-либо другие шаблоны, то такие символы могут быть легко помещены
в
...Поділитися у соцмережах