Рассел Сейдж. Приемы профессиональной работы в unix перевод "Tricks of the unix masters" by Russel G
Вид материала | Документы |
СодержаниеЖизнь системы unix: некоторые метафоры Комбинирование продуктивных идей Поиск файлов Распечатка файловой информации 2.1. Поиск файлов Формат вызова |
- Лекция 10. Файловые системы Unix, 116.79kb.
- Unix-подобные операционные системы, характеристики, особенности, разновидности, 40.63kb.
- Методические материалы, 3002.45kb.
- Курс для опытных администраторов unix, 67.69kb.
- Министерство Образования Российской Федерации. Юургу курсовая, 383.18kb.
- Программа курса «unix», 18.71kb.
- Лабораторная работа №1. Командный интерпретатор, 418.36kb.
- The design of the unix operating system by Maurice, 9215.6kb.
- Разработка автоматизированной системы мониторинга аппаратного и программного обеспечения, 20.06kb.
- Лекція 6 "Інформатика та комп'ютерна техніка" Тема Сервісні та прикладні програми Види, 55.04kb.
систему, вы получаете почту о том, что у вас имеется сохраненный файл
редактора, который вы можете восстановить и поместить его на исходное
место.
Каталог 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 есть каталоги, а файл