дами ls, size, nm и file. Файлы данных анализируются командой od.
Текстовые файлы анализируются командами more, wc, head, tail и други-
ми. Таким образом, обычно вам необходимо работать в данный момент вре-
мени с файлами какого-нибудь одного типа.
ЧТО ДЕЛАЕТ kind?
Командный файл kind - это утилита, которая распечатывает имена
всех файлов, имеющих указанный тип. Она имеет интерфейс, похожий на
интерфейс команды ls, т.е. вы можете передать ей опции и имена файлов
или символы расширения имен файлов. При выводе отображаются полные
имена, если они были указаны, но вы можете избежать появления лишней
информации при выводе, если предварительно перейдете в нужный каталог
с помощью команды cd. Например, если бы я находился в моем регистраци-
онном каталоге (/usr/russ) и ввел команду
$ kind -d /etc/*
то вывод мог бы выглядеть так:
---------------------------------------------------------------------------
|
| /etc/mnttab
| /etc/utmp
| /etc/wtmp
|
То есть, вывелся список всех файлов данных. А если бы я выполнил
такую последовательность команд:
$ cd /etc
$ kind -d *
то при выводе убрался бы маршрут, использованный в вызывающей последо-
вательности, и напечаталось бы следующее:
---------------------------------------------------------------------------
|
| mnttab
| utmp
| wtmp
|
Затем выход в таком виде может быть использован во внешней коман-
де для распечатки и анализа файловой информации.
Допустимыми опциями команды kind являются -a для файлов архивов,
-d для файлов данных, -t для текстовых файлов (что является умолчани-
ем) и -x для исполняемых файлов. Определение этих типов соответствует
команде UNIX file. Заметим, что критерии того, что файл является
исполняемым, в команде file отличаются от тех, которые применяет ко-
манда ls: ls проверяет биты x в индексном дескрипторе файла, в то вре-
мя как file проверяет, являются ли первые несколько байтов содержимого
файла "магическим числом". Это магическое число является идентификато-
ром структуры a.out (см. /usr/include/a.out.h), который сообщает "Я
являюсь скомпилированной Си-программой".
Имена файлов появляются в командной строке после опций. Эти имена
могут быть порождены любым стандартным методом системы UNIX. Если в
командной строке нет имен файлов, то kind превращается в фильтр и чи-
тает стандартный ввод для получения списка имен файлов. (Обратите вни-
мание, что я сказал "имен файлов", а не "файлов". Можно использовать
опции, поскольку они убираются из командной строки командой shift по
мере того, как они встречаются.) Таким образом, вы можете использовать
другие команды для того, чтобы передать по конвейеру список файлов
утилите kind. Она отфильтровывает и выводит только те из них, которые
соответствуют нужному вам типу.
ПРИМЕРЫ
1. $ od `kind -d /etc/*`
Выглядит так, как будто это должно работать, но команда od не ра-
ботает с набором имен файлов. Она может обрабатывать только один файл
в данный момент времени.
2. $ ll `sh -x kind -a /lib/*` | m
Это длинный пример. Выводит в длинном формате список всех файлов
архивов, которые находятся в каталоге /lib. Мы запускаем shell в отла-
дочном режиме выполнения, так что вы можете увидеть каждую командную
строку перед ее выполнением. Результат по конвейеру передается команде
more.
3. # find / -print | kind -x | while read FILE
> do
> ll $FILE
> done > /tmp/filelist
Данный цикл обнаруживает все действительно исполняемые файлы. Для
каждого из них выполняется команда "ls -l". Отметим, что здесь команда
ll вызывается для каждого имени файла.
Вы могли бы выполнить ту же операцию при помощи такого оператора
find:
# find / -perm -0111 -exec ll {} \;
но опция perm в данном случае опять же проверяет биты прав доступа в
индексном дескрипторе файла, а не ищет магическое число в структуре
a.out, как описано ранее. Кстати, для того, чтобы вы могли успешно за-
пустить команду file (и тем самым kind) на системных файлах, вы должны
иметь права чтения, чтобы можно было прочитать магическое число.
4. $ for F in `kind /bin/* /usr/bin/* /etc/*`
> do
> fgrep "trap" $F /dev/null
> done
$ fgrep "trap" `kind /bin/* /usr/bin/* /etc/*`
$ find /bin /usr/bin /etc -exec fgrep "trap" {} \;
Это три различных способа поиска слова "trap" во всех текстовых
файлах.
ПОЯСНЕНИЯ
Опции, которые могут быть указаны в командной строке, должны быть
самым первым аргументом. Это создает более строгий синтаксис, по кото-
рому можно выловить ошибку. Но это несколько ограничивает гибкость.
Как было ранее отмечено, вы можете, если хотите, по-своему разрешить
компромисс между эффективностью и гибкостью путем дополнительного
программирования.
В строке 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` <-поиск таблицы описания тер-