Рассел Сейдж. Приемы профессиональной работы в unix перевод "Tricks of the unix masters" by Russel G

Вид материалаДокументы

Содержание


Жизнь системы unix: некоторые метафоры
Комбинирование продуктивных идей
Поиск файлов
Распечатка файловой информации
2.1. Поиск файлов
Формат вызова
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   45
сохраненный файл и помещает его в /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 есть каталоги, а файл