библиотеки, код ядра, код машинного языка и автономные утилиты. Часто
в /usr/src хранится также исходный код для локальной машины.
Каталог sys традиционно хранит файлы, необходимые для генерации
нового ядра. Это файлы-заголовки, конфигурационный файл, библиотеки и
командный файл для создания нового ядра из всех этих файлов.
Последний каталог - tmp. Это вторичная временная область хране-
ния, которая используется не так часто, как /tmp. Ее, однако, исполь-
зует утилита sort.
ЖИЗНЬ СИСТЕМЫ UNIX: НЕКОТОРЫЕ МЕТАФОРЫ
UNIX - это особый мир, живущий своей жизнью. Его социальная
структура имитирует реальную жизнь, с правительством, содержащим пра-
вителя (корень root), штатом поддержки (bin, cron, lp, sys) и массами
(/usr/*). Массы не имеют доступа к мощи правителя, если не используют
предварительно установленных средств (/bin/su) или не занимаются кри-
минальными действиями и нарушением мер безопасности. Как и в любом об-
ществе, большая многопользовательская система UNIX устанавливает права
и обязанности своих пользователей.
При входе в систему пользователь получает свое "место под солн-
цем" (регистрационный каталог - $HOME ). Это место зависит от того,
что было раньше (от родительского каталога ..), а будущие места за-
висят от того, что происходит позже (каталоги, подчиненные $HOME).
Работа распределяется по организациям и иерархиям в зависимости
от их функций в обществе (все пользователи в /usr, все транзитные фай-
лы в /usr/spool, все функции безопасности в /etc). Посмотрите вокруг
себя в вашей системе, чтобы ознакомиться с вашим миром. Вы можете
после этого выбрать, участвовать ли в некоторой части этого мира или
игнорировать ее.
Движение людей в системе UNIX происходит параллельно. Некоторые
области (/tmp) доступны всем, а некоторые области сильно охраняются от
большинства людей (/etc/passwd). Транспортная служба может перевезти
наши вещи (передача файлов по сетям uucp). Мы даже можем воспользо-
ваться общественным транспортом, чтобы добраться в разные части города
(вход в другие системы (rlogin), эта особенность имеется только в
BSD).
В мире UNIX нам доступны различные пути. Эти пути помогают нам
сформировать свою судьбу (дисковые разделы, монтированные в любое
место файлового дерева). Когда дисковый пакет монтируется, он стано-
вится доступным нам. Когда он демонтируется, мы теряем доступ к нему.
Когда запускаются процессы, они проходят через различные этапы
своей жизни. Они рождаются (ответвляются), растут (становятся планиру-
емыми и помещаются в таблицу процессов) и, наконец, становятся произ-
водительными рабочими в обществе (переходят в состояние запуска и вы-
полняются).
Все процессы имеют фамильное дерево. Порожденный процесс всегда
имеет родителя, а родительские процессы могут порождать много "детей".
В зависимости от приложения, они могут быть "дедами" и "внуками". Про-
цессы "умирают" так же легко, как создаются. Одной из необычных вещей
в мире UNIX является то, что "дети" почти всегда "умирают" раньше сво-
их "родителей".
Правительство (ядро) проводит в жизнь параметры среды, которые
выглядели бы в довольно тоталитарном духе, если бы это было в реальном
мире. Только определенное число рабочих допускается к рабочему месту
одновременно (это максимальное количество ячеек в таблице процессов).
Рабочие ограничены в числе "детей", которых они могут иметь (макси-
мальное количество процессов на пользователя). Поскольку рабочие на-
капливают материальные ценности, они ограничены в количестве товаров,
которые они могут поместить в комнаты своих домов (максимальный размер
файла, или ulimit). Хотя не установлен лимит на число различных файлов
(комнат) максимального размера, которые могут существовать, вся систе-
ма имеет предел (df показывает свободное пространство), и одна не-
насытная персона может нанести удар по окружающим. Здесь возникает
своего рода экология.
Так же, как компьютерный век проходит под присмотром электронной
автоматики, так и UNIX ведет таблицы о деятельности всех пользовате-
лей. Механизмы учета организованы правительством (внутри ядра) и всег-
да записывают действия каждого пользователя. Тем не менее, это свобод-
ное общество в той мере, что вы можете получить распечатку о вашем
кредитном состоянии (используя acctcom для печати учетных записей).
Хотя система UNIX имеет негативные аспекты (как и человеческое
общество), в ней есть также некоторые очень позитивные особенности.
Гибкость системы и богатство инструментов дает нам очень продуктивную
и детально разработанную рабочую среду. Наша производительность в этом
смысле ограничена в основном нашим собственным воображением. Когда ра-
бота становится слишком утомительной и скучной, мы всегда можем создать
средства, делающие за нас эту работу. Это обстановка свободной инициа-
тивы, в которой хорошие идеи могут дать значительное увеличение произ-
водительности.
* ГЛАВА 2. Доступ к файлам *
СОДЕРЖАНИЕ
Введение
2.1. Поиск файлов
2.1.1. tree - визуализация файлового дерева
2.1.2. thead - печать начала каждого файла
2.1.3. tgrep - поиск строк в дереве файловой системы
2.1.4. paths - нахождение пути доступа к исполняемым файлам, со
специальными опциями
2.2. Вывод информации
2.2.1. lc - вывод файловой информации на экран по столбцам
2.2.2. ll - вывод файловой информации в длинном формате
2.2.3. kind - вывод однотипных файлов
2.2.4. m - простой доступ к команде more
2.2.5. mmm - обработка программой nroff макрокоманд для рукописей
2.2.6. pall - печать всех файлов в дереве
ВВЕДЕНИЕ
В главе 1 был представлен обзор общей структуры системы UNIX и
показано, как взаимодействуют ее различные части. Это похоже на введе-
ние в географию, когда на глобусе показывают континенты и крупные вод-
ные пространства. Такая информация, хотя и является хорошим фундамен-
том для общих знаний, вряд ли поможет найти наилучший путь из
Сан-Франциско в Лос-Анжелес. Необходим следующий уровень детализации:
названия поселений, дорог, развилок, улиц, адресов.
Файловая система UNIX похожа на континент со множеством городов
и, действительно, с адресами внутри городов. Каталоги и различные
уровни подкаталогов можно сравнить с маршрутами между различными пунк-
тами назначения, названия файлов - с адресами. Большое число путей и
мест назначения может выглядеть пугающе, но благодаря регулярности и
логичности, файловая система UNIX позволяет вам легко перемещаться
из одного места в другое, если вы знаете несколько основополагающих
принципов.
Будучи пользователями UNIX, все мы научились пользоваться основ-
ными командами файловой информации, как, например, ls с различными оп-
циями. Мы знаем, как перемещаться между каталогами и копировать или
перемещать файлы. Тем не менее, находить нужную информацию о файлах из
всей массы информации не так-то легко. Нам необходимо создать инстру-
ментальные средства, которые используют древовидную структуру файлов в
UNIX, чтобы находить то, что мы ищем, и, соответственно, выводить ин-
формацию о файлах на экран, печатать листинги содержимого файлов и
т.д.
Эта глава знакомит с инструментальными средствами, которые облег-
чают задачу поиска и доступа к файлам. Доступ к файлам может быть
обеспечен различными способами, поэтому техника и стиль меняются от
одного командного файла к другому. Например, в некоторых случаях вам
нужно найти имена всех файлов в данном сегменте файлового дерева, в
других случаях вас будут интересовать файлы только заданного типа:
текстовые файлы вообще или исходные файлы на языке Си в частности.
КОМБИНИРОВАНИЕ ПРОДУКТИВНЫХ ИДЕЙ
Две концепции являются общими почти для всех файловых инструмен-
тальных средств. Первая - это идея рекурсивного поиска, которая озна-
чает, что некоторые команды системы UNIX (например, find) просматрива-
ют все файловое дерево, начиная с некоторой заданной начальной точки
(или с текущего каталога). Если в данном каталоге встречается подката-
лог, то его содержимое тоже исследуется - и так далее вниз к самому
нижнему под-подкаталогу. Так проходятся маршруты ко всем файлам в це-
лом дереве.
Стандартные команды системы UNIX обеспечивают только ограниченное
число основных функций, которые могут работать рекурсивно по всему
файловому дереву. Наша стратегия при создании инструментальных средств
в этой главе - воспользоваться преимуществами такого рекурсивного по-
иска и распространить их на многие другие функции.
Вторая ключевая идея, связанная с полезными файловыми инструмен-
тальными средствами - это возможность соединения команд с программными
каналами и управление потоком данных с помощью переадресации. Вероят-
но, вы уже встречались с подобными особенностями в вашей собственной
работе с UNIX и эффективно их использовали. Возможно, вы еще не осоз-
нали, что соединение рекурсивного поиска, предоставляемого некоторыми
стандартными командами, со специфическими функциями, предоставляемыми
другими командами, позволяет нам создать команды, которые автомати-
чески обходят обширные файловые деревья и извлекают нужную информацию.
(В следующей главе мы выйдем за пределы распечатки и отображения ин-
формации на экран и научимся работать с файлами так, что мы сможем ко-
пировать, перемещать и восстанавливать их по мере надобности.)
Для удобства мы сгруппируем инструментальные средства в два раз-
дела: поиск файлов и распечатка файловой информации. Имеет смысл
представлять их в таком порядке, так как вы сначала должны найти файл,
чтобы потом с ним работать.
ПОИСК ФАЙЛОВ
Этот раздел посвящен поиску файлов, где бы они ни находились, вы-
воду на экран выбранной информации и поиску символьных строк внутри
файлов.
Первая программа, tree, обходит все файловое дерево и печатает
имена всех файлов в формате визуального дерева. Она рекурсивно спуска-
ется в каждый каталог и находит все его файлы, обеспечивая тем самым
глобальный осмотр файловых областей и их вложенной по глубине структу-
ры.
Другое инструментальное средство - это thead. Thead печатает
несколько первых строк текстовых файлов, которые находятся в данном
сегменте файлового дерева. Просматривая заголовок, т.е. первые
несколько строк файла, вы можете получить достаточно информации, чтобы
идентифицировать содержимое файла. При вызове thead вы можете явно за-
дать каталог либо передать команде thead по конвейеру список полных
имен файлов. Это делает команду thead фильтром - особым видом команд
системы UNIX, который мы обсудим позже.
Следующее инструментальное средство - tgrep. Как следует из наз-
вания, это еще одна команда, связанная с файловым деревом, которая
использует утилиту grep. Tgrep ищет символьные строки в каждом файле,
который находится в данном сегменте файлового дерева. Tgrep также яв-
ляется фильтром, так что имена файлов можно передавать ей по конвейе-
ру.
В нашем последнем проекте в этом разделе мы обратимся к использо-
ванию каталогов как средства "навигации". Сначала мы опишем основной
алгоритм для утилиты, которая для каждого файла из заданного списка
файлов проверяет, находится ли этот файл в каком-либо каталоге по ука-
занному маршруту поиска. Затем мы построим paths - утилиту, которая
дополняет функцию поиска полезными опциями.
РАСПЕЧАТКА ФАЙЛОВОЙ ИНФОРМАЦИИ
Этот раздел знакомит вас с инструментальными средствами, предназ-
наченными для вывода на экран имен файлов и их содержимого. Инструмен-
ты такого рода весьма полезны, так как они могут значительно уменьшить
количество необходимых символов, набираемых с клавиатуры при запуске