Жанр: Учеба
Приемы профессиональной работы в Unix
...ы устройств являются точками доступа к периферии, подсоединенной
к системе. Этот файл привязан к периферии с помощью ядра и
драйвера устройства.
Административные утилиты и конфигурационные файлы хранятся в
/etc. Примерами являются getty и gettydef, init и inittab, а также
файл паролей (/etc/passwd).
Следующий каталог - /lib, где размещены библиотеки компилятора.
Здесь могут храниться и другие типы библиотек.
Каталог /lost+found используется утилитой fsck (главное средство
поддержания файловой системы) для хранения логически удаленных файлов.
Если на самом деле вы хотите сохранить эти файлы, они могут быть извлечены
из этой удерживающей области после завершения уборки файловой
системы.
Следующий каталог - /mnt. Это временная точка монтирования для
файловых систем. Мы часто монтируем и демонтируем файловые системы
просто для того, чтобы запустить быструю проверку чего-либо. Здесь подходящее
место для этого.
Главным временным рабочим каталогом системы является /tmp. Многие
утилиты, такие как vi, fsck, интерпретаторы shell и программы резервного
копирования, используют /tmp для хранения рабочих файлов.
Следующий каталог - /usr, который применяется как точка монтирования.
Файловая система, смонтированная здесь, содержит дополнительную
системную информацию и каталоги пользователей. Это разделение между
загружаемой файловой системой и пользовательской файловой системой было
сделано, чтобы сбалансировать загрузку диска. Если бы все важные
файлы были в одном разделе, он был бы слишком большим. Производительность
может быть ухудшена, если все действия направлены в одну логическую
область диска. Благодаря разбивке всей системы на две, каждая
файловая система поддерживает разумное количество свободного пространства.
Чуть ниже мы рассмотрим каталог /usr более подробно.
Последний файл - это само ядро, /unix. Весь /unix фактически существует
и представляет собой большой a.out (скомпилированный объектный
файл). Ядро изготавливается путем запуска ld на группе библиотек,
которые загружаются по очереди в огромный исполняемый модуль, называемый
/unix. Машина запускается с первых 512 байтов корневой файловой
системы. Программа начальной загрузки, которая находится здесь, загружает
программу загрузки большего размера, иногда называемую /boot.
/boot загружает и запускает /unix.
ВТОРОЙ СЛОЙ
Второй слой каталогов размещается под /usr. Как упоминалось ранее,
/usr используется как точка монтирования для другой файловой
системы. Это значит, что все файлы, которые имеются в /usr, находятся
в другом разделе загружаемого диска или вообще на другом диске.
Первым каталогом является adm, для администрирования. Он
содержит учетные файлы и регистрационный файл для su (суперпользователя),
а также другие административные файлы.
В каталоге bin имеются исполняемые модули, которые используются
менее часто, чем модули в двоичном каталоге корневого уровня (/bin).
Почти все исполняемые модули распределены между этими двумя каталогами.
Другие исполняемые модули рассеяны по всей системе, например
/usr/lib/uucp/uucico и /usr/lib/ ex3.7preserve.
Далее games. UNIX приходит с ассортиментом интересных игр. Большинство
из них текстовые, но предоставляется несколько программ графического
типа, например worm, worms и rain.
Каталог include содержит все файлы-заголовки. Файлы-заголовки
используются в программах на языке Си для определения структур и
системных присваиваний, полезных для программирования. Здесь имеется
подкаталог sys, который содержит все файлы= заголовки, относящиеся к
системе. Читая эти файлы-заголовки, можно многое узнать о системе
UNIX.
Следующий каталог - lib, который содержит библиотечные файлы для
всех видов "имущества": файлы печатающих устройств, файлы поддержки
утилиты vi, другие языки и uucp. Каталог /usr/ lib представляется
складом всяких библиотек, которые имеются в системе, отличных от библиотек
компилятора.
Каталог lost+found находится здесь для той же цели, что и одноименный
каталог корневого уровня. Каждая файловая система должна иметь
такой файл. Без него fsck не имеет временного места для размещения полуудаленных
файлов и поэтому удаляет их навсегда.
В каталоге mail находится ваш системный почтовый ящик. Когда вы
запускаете команду mail, здесь накапливается очередь сообщений. В каталоге
usr/mail каждый файл носит имя пользователя. В этом файле хранится
почта пользователя, пока он не прочитает ее.
Каталог man предназначен для активных страниц руководств по
системе UNIX. Наличие постоянного доступа к страницам руководств является
хорошим средством. Однако, эти страницы занимают много места, и
доступ к ним может потребовать довольно много времени при сильно загруженной
системе.
В каталоге news хранятся все файлы новостей. Эти файлы именованы
в соответствии с порядком, в котором они были введены в каталог. Команда
news(1) смотрит на дату файла $HOME/ .news_time, чтобы сообщить,
какие новости вы еще не читали.
Каталог preserve предназначен для файлов, связанных с утилитой
vi. Они помещаются сюда, когда вы работаете с vi или с редактором ex и
пропадает питание машины либо ваш сеанс работы прерывается в виде "зависания".
Когда в системе восстанавливается питание, /tmp содержит
файлы редактора ex. Из каталога /etc/rc запускается утилита
/usr/lib/ex3.7preserve, которая просматривает /tmp, преобразует его в
сохраненный файл и помещает его в /usr/preserve. Когда вы входите в
систему, вы получаете почту о том, что у вас имеется сохраненный файл
редактора, который вы можете восстановить и поместить его на исходное
место.
Каталог pub не содержит ничего особенного, обычно в нем просто
некоторые информационные файлы вроде таблицы ASCII или греческих символов.
Каталог spool - это главная точка входа для всех буферизованных
файлов в системе. В этом каталоге имеется много подкаталогов, содержащих
специфические типы буферизованных файлов. Некоторыми типичными
подкаталогами являются lp, uucp и uucppublic.
В каталоге src хранится исходный код системы UNIX, если он имеется
в системе. От этого каталога ответвляется много уровней: команды,
библиотеки, код ядра, код машинного языка и автономные утилиты. Часто
в /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 - утилиту, которая
дополняет функцию поиска полезными опциями.
РАСПЕЧАТКА ФАЙЛОВОЙ ИНФОРМАЦИИ
Этот раздел знакомит вас с инструментальными средствами, предназначенными
для вывода на экран имен файлов и их содержимого. Инструменты
такого рода весьма полезны, так как они могут значительно уменьшить
количество необходимых символов, набираемых с клавиатуры при запуске
команды, и внести больше смысла в одну команду.
Первые два командных файла являются пре- и постпроцессорами для
команды ls. Команда lc выводит файловую информацию по столбцам, команда
ll перечисляет файлы в длинном формате. Эти командные файлы дополнены
опциями команды ls, чтобы сделать распечатки более информативными.
Так как команда ls используется довольно часто, упаковка наиболее
часто применяемых нажатий клавиш в командные файлы представляется целесообразной.
Упаковка уменьшает количество постоянно набираемых символов
и упрощает использование команд, исключает необходимость запоминания
подробного синтаксиса.
Третье инструментальное средство - это kind. Kind - еще один командный
файл препроцессорного типа, использующий команду UNIX file.
Команда file читает указанный файл и затем сообщает, является ли этот
файл текстовым, архивным или исполняемым. Поскольку распечатки команды
file не выбирают файлы заданного типа, возникает необходимость в создании
для этого специальной утилиты. Команда kind работает с распечаткой
команды file. Kind выводит на экран имена файлов только заданного
типа.
Еще один командный файл - m, который облегчает работу со стандартной
командой more системы UNIX, уменьшая количество необходимых
для запуска команды символов и упрощая интерфейс. Делается это без потери
гибкости: так же, как вы можете использовать команду more для
файла или передать команде more данные по программному каналу, вы можете
сделать то же самое для m.
Следующий командный файл - это mmm. Он состоит из одной заготовленной
командной строки для программы nroff системы UNIX. Существует
много способов вызова команды nroff и множество различных опций к ней.
Если же вы редко используете nroff, у вас могут возникнуть трудности в
запоминании специфических опций, необходимых для вашей работы с командой.
Эти проблемы отпадут, если у вас есть команда mmm. Определите опции,
которые вы обычно используете, и введите их в командный файл mmm
(о том, как это сделать практически, речь пойдет ниже). Теперь достаточно
набрать mmm - и вы имеете возможность работать с вашей командой
nroff.
Последняя утилита - pall. Pall обходит файловое дерево, ведя поиск
файлов заданного типа, и готовит их к выводу на принтер. Команда
pr системы UNIX используется для разбивки на страницы всех файлов
вместе и включения заголовков. Эта команда предлагает на рассмотрение
принтеру один большой файл и наиболее полезна в тех случаях, когда у
вас имеется множество каталогов с текстовыми файлами или с исходными
файлами программ.
Определив в общем основные наши задачи, перейдем к более близкому
знакомству с упомянутыми инструментальными средствами.
2.1. ПОИСК ФАЙЛОВ
2.1.1. tree - визуализация файлового дерева
---------------------------------------------------------------------------
ИМЯ: TREE
---------------------------------------------------------------------------
tree - вывод на экран структуры файлового дерева
НАЗНАЧЕНИЕ
Находит все файлы в файловом дереве и выводит на экран имена файлов,
показывая иерархическую структуру файлового дерева.
ФОРМАТ ВЫЗОВА
tree [dir]
ПРИМЕР ВЫЗОВА
$ tree $HOME
Выводит структуру файлового дерева регистрационного каталога.
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) tree v1.0 Visual display of a file tree Author: Russ Sage
2а вывод на экран структуры файлового дерева
4 if [ "$#" -gt 1 ]
5 then echo "tree: wrong arg count""&2
6 echo "usage: tree [dir]" "&2
7 exit 2
8 fi
9 if [ "$#" -eq 1 ]
10 then if [ ! -d $1 ]
11 then echo "$0: $1 not a directory""&2
12 echo "usage: tree [dir]" "&2
13 exit 2
14 fi
15 fi
17 find ${1:-.} -print | sort | sed -e "1p" -e "1d" \
18 -e "s|[^/]*/| /|g" \
19 -e "s|[^ */|/|" \
20 -e "s|/\([^/]*\)$|\1|"
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ tree?
Как мы уже отмечали, вся система UNIX строится вокруг файловой
системы, которая похожа на дерево. Дерево, с которым мы работаем в
системе UNIX, растет вверх ногами: корень находится вверху, а ветви и
листва растут вниз от корня. Физическая структура реальных деревьев и
файловых деревьев, используемых в системе UNIX, очень сходна: один корень
(начальная точка) и один ствол. Как глубоко и как далеко могут
уходить ветви от основного ствола - не ограничивается ничем, кроме ограничений
физического пространства. Аналогично, число листьев, которые
может иметь каждая ветвь, фактически не ограничено.
Многое в системе UNIX задумано для того, чтобы приспособиться к
дереву. Некоторые команды обходят дерево и сообщают о его компонентах,
но обычно их сообщения выдаются в форме, не очень удобной для чтения
человеком. Это делает командные файлы весьма мощными инструментами.
Перевести необработанные, недружественные сообщения командных файлов в
удобный, информативный вид довольно легко.
Команда tree является комбинацией команд системы UNIX, которые
представляют логическую файловую структуру в наглядной форме. Эта команда
полезна для получения глобальной картины файлов, их расположения
в иерархической структуре файлового дерева, гнездовой структуры каталогов
и подкаталогов.
ЧТО ДЕЛАЕТ tree?
Команда tree - это постпроцессор для команды UNIX find. Find
просматривает сегмент файлового дерева и полные имена всех файлов, которые
соответствуют заданному критерию. Команда tree использует утилиту
sed системы UNIX, чтобы перевести выход команды find в наглядную
форму.
Входным параметром для команды tree является имя каталога, которое
может быть указано в любом абсолютном виде, например,
/usr/spool/uucp, или в относительном, например, ../../bin. Если никакого
имени не указано, подразумевается ., что является текущим каталогом.
Имя каталога является началом (или корнем) отображаемого дерева.
Чтобы показать глубину дерева, все файлы, подчиненные данному каталогу,
отображаются с отступом. Для удобства представления гнездовой
структуры, между следующими друг за другом ответвлениями печатается
косая черта (/).
Рассмотрим пример структуры каталога. Пусть корневым каталогом
будет /tmp с двумя каталогами: a и b. В каталоге a находится подкаталог
aa, который содержит файл file1, а в каталоге b , соответственно,
подкаталог bb, содержащий файл file2. Команда find выдаст распечатку
такого вида:
# find /tmp -print
/tmp
/tmp/a
/tmp/a/aa
/tmp/a/aa/file1
/tmp/b
/tmp/b/bb
/tmp/b/bb/file2
Как видно из этого листинга, файлы a и aa есть каталоги, а файл
file1 находится внизу файлового дерева. Сравните этот результат с результатом,
который выдает команда tree, используя утилиту sed.
# tree /tmp
/tmp
/ a
/ / aa
/ / / file1
/ b
/ / bb
/ / / file2
Корневым каталогом в этом листинге является каталог /tmp. Там,
где дерево переходит на более глубокий уровень, печатаются только символы
косой черты. Первый уровень - /tmp, под этим уровнем находятся
файлы-каталоги a и b, затем, соответственно, их подкаталоги aa и bb.
Исходя из этого листинга, мы делаем вывод, что на первом уровне каталога
находятся два файла (и эти файлы в действительности являются каталогами)
и что два файла находятся в подчиненных каталогах. Отметим,
что мы смогли идентифицировать aa и bb как каталоги только потому, что
в них присутствуют файлы file1 и file2.
Сравните этот листинг с выходом "необработанной" команды find.
Выход команды tree исключает отвлекающее внимание повторение элементов
путей доступа при каждом переходе к более низкому уровню. Благодаря
этому, сразу же видно СУЩЕСТВЕННУЮ информацию. Вот что мы имеем в виду,
когда говорим о создании более наглядного для человека интерфейса
с системой UNIX.
ПРИМЕРЫ
1. $ tree
Использует подразумеваемый каталог
...Поділитися у соцмережах