Рассел Сейдж. Приемы профессиональной работы в unix перевод "Tricks of the unix masters" by Russel G
Вид материала | Документы |
СодержаниеФормат вызова |
- Лекция 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.
недопустима.
ФОРМАТ ВЫЗОВА
dosflp [-a] [-c] [-dDRIV] [-eEXP][-h] [-l] [-r] [-sDIR]
где
-a означает копирование файлов, соответствующих *.asm
-c означает копирование файлов, соответствующих *.c
-d выбирает имя устройства DRIV из набора A,B,X,Y (по умолчанию A)
-e использует выражение EXP, чтобы применить к файлам grep
-h копирует файлы, соответствующие *.h
-l только выдает список файлов
-r удаляет файлы вместо их копирования
-s указывает подкаталог DIR на гибком диске формата DOS
Пример вызова
dosflp Копирование всех файлов с устройства A: в текущий
каталог
Исходный код для dosflp
1 :
2 # @(#) dosflp v1.0 Wildcard copies from DOS floppy
Author: Russ Sage
4 EXP=.\*
5 DRIVE="A:"
6 OP="c"
8 if [ "$#" -gt 0 ]
9 then for ARG in $@
10 do
11 case "$ARG" in
12 -a) EXP='.*\.asm$';;
13 -c) EXP='.*\.c$';;
14 -d*) DRIVE="`echo $ARG | cut -c3-`:";;
15 -e*) EXP='`echo $ARG | cut -c3-`';;
16 -h) EXP='.*\.h$';;
17 -l) OP="l";;
18 -r) OP="r";;
19 -s*) DRIVE="$DRIVE`echo \"$ARG" | cut -c3- `/";"
20 *) echo "dosflp: arg error"
21 echo "usage: dosflp [-a] [-c] [-d] [-e] [-h] [-l]
[-r] [-s]"
22 exit 1;;
23 esac
24 done
25 fi
27 case $OP in
28 c) echo "\nCopying files from $DRIVE to `pwd`";;
29 l) echo "\nListing files on $DRIVE"
30 dosdir $DRIVE | more
31 exit;;
32 r) echo "This option removes all the data on the floppy."
33 echo -n "Do you want to do this (y/n): "
34 read RSP
35 if [ "$RSP" = "y" ]
36 then echo "\nRemoving files on $DRIVE"
37 else exit
38 fi;;
39 esac
41 dosls $DRIVE | tr "[A-Z]" "[a-z]" > /tmp/doslist
43 for FILE in `grep "$EXP" /tmp/doslist`
44 do
45 echo $FILE
46 case $OP in
47 c) doscp $DRIVE$FILE .;;
48 r) dosrm $DRIVE$FILE;;
49 esac
50 done
52 rm /tmp/doslist
Переменные среды выполнения
ARG Хранит аргументы командной строки
DRIVE Устройство с гибким диском формата DOS
EXP Выражение, имитирующее действие символа-шаблона
FILE Хранит имя файла, над которым производится действие
OP Ключ, определяющий необходимое действие
Описание
Зачем нам нужен dosflp?
Это команда только для системы XENIX. Операционная система XENIX,
являясь продукцией фирмы Microsoft, имеет средства для общения с файло-
вой системой MS-DOS. Для ознакомления с основами совместного использо-
вания DOS и XENIX давайте рассмотрим основные параметры.
Каждый жесткий диск может иметь максимум четыре раздела. Это огра-
ничение MS DOS, которое перенесено в мир XENIX. Ничего плохого в этом
нет, пока мы не начинаем работать с жестким диском большой емкости. Для
70-мегабайтного диска, например, вы можете создать четыре рав-
ных раздела, каждый из которых содержит приблизительно 17 Мбайт. Вы мо-
жете создать меньший раздел, но тогда другой раздел должен быть больше.
В зависимости от того, какая часть ваших программ и данных должна быть
использована в основном MS-DOS и какая - XENIX, может быть использована
различная конфигурация.
Большим преимуществом системы XENIX/DOS является то, что XENIX мо-
жет размещаться в одном разделе, а DOS в другом. Как это сделать? Нужно
запустить программу "fdisk" в каждой операционной системе. Это значит,
что XENIX может общаться с разделом DOS, получая полное имя устройства,
указывающее на другой раздел. Драйвер, который читает раздел DOS, дол-
жен знать, как выглядит DOS (т.е. знать файловую систему DOS). Если вы-
полнить такую операцию, можно получать списки файлов и копировать их
туда и обратно. К сожалению, DOS не имеет возможности чтения разделов
XENIX.
При работе с гибким диском вы имеете дело только с одним разделом.
Это снова ограничение DOS. Некоторые системы UNIX, в отличие от DOS,
позволяют иметь столько разделов на жестком или гибком диске, сколько
вы хотите, в отличие от DOS. По определению, гибкий диск DOS сформати-
рован в системе DOS, которая выполняет форматирование низкого уровня и
помещает файловую систему DOS на гибкий диск.
В системе XENIX гибкий диск может быть либо в формате файловой
системы, либо неструктурированным устройством последовательного доступа
подобно магнитной ленте. Для процедуры dosflp мы используем только гиб-
кие диски в формате DOS.
Теперь к делу. Предположим, вы имеете систему DOS и файлы, находя-
щиеся на диске DOS, вы можете читать и писать файлы на гибкий диск из
XENIX. Но существуют некоторые ограничения на выполнение операции копи-
рования, которые не слишком удобны пользователю. Например, вы можете
сказать "doscp *.c a:". В результате все файлы текущего каталога кото-
рые оканчиваются на .c, будут скопированы на гибкий диск формата DOS на
устройстве a:. Побочный эффект выполнения doscp заключается в том, что
все символы перевода строки (или прогона строки) превращаются в символ
возврат каретки/перевод строки, поскольку DOS обрабатывает конец строки
иначе, чем XENIX. Таким же образом, когда вы копируете с гибкого диска
формата DOS в XENIX, лишние символы возврата каретки убираются.
Что вы не можете сделать, так это сказать "doscp a:*.c". Команда
doscp не допускает указания вида *.c при копировании с гибкого диска.
Это происходит потому, что командный процессор распространяет метасим-
волы (*,?,[]) и не может непосредственно читать раздел DOS. Поэтому вы
не можете использовать символы при копировании с гибкого диска DOS.
Отметим, что может наблюдаться гораздо больше побочных эффектов,
когда вы имеете дело с гибкими дисками DOS. Во-первых, длина имени фай-
ла ограничена. DOS допускает до восьми символов имени файла плюс три
символа расширения. В результате после копирования всех ваших файлов
XENIX на гибкий диск многие из них могут иметь не те имена, которые они
имели в XENIX. Это сущее страдание, когда вы пытаетесь сделать копию на
гибкие диски DOS, потому что вы больше не имеете уверенности, как обра-
щаться к файлам, когда вы копируете их обратно с гибкого диска. Кроме
того, поскольку расширение имени файла в DOS имеет только три символа,
файл с именем "spreadsheet.finance" может оказаться на гибком диске DOS
с именем "spreadsh.fin" и распознавание его может представлять опреде-
ленные трудности.
Но это еще не все. Когда файл копируется из XENIX в DOS, ВСЕ имена
в DOS записываются заглавными буквами. Если у вас есть файлы с именами,
в которых смешаны верхний и нижний регистры, то вы несколько потеряете
понятность имен. Если вы используете в именах символы верхнего регистра
при копировании файлов обратно в XENIX, они не переводятся на нижний
регистр. В результате все имена ваших файлов оказываются записанными
символами верхнего регистра в XENIX, что не очень удобно.
В чем мы нуждаемся, так это в таком средстве, которому мы можем
указывать, какие файлы копировать с гибкого диска на жесткий диск, и
которое копирует их с сохранением регистра в имени файла. Все это дела-
ет процедура dosflp.
Что делает dosflp?
Dosflp пытается исключить все негативные аспекты копирования фай-
лов XENIX/DOS. Это высокое требование, но оно достижимо. Вкратце подход
dosflp следующий: получить список имен файлов с гибкого диска, пере-
вести имена в нижний регистр, выбрать из полного списка имена тех фай-
лов, которые соответствуют вашим требованиям, и затем копировать файлы
один за другим в текущий каталог XENIX. Для того, чтобы сделать это,
требуется гораздо больше команд XENIX вида dosxx, а также различных
других команд XENIX.
В дополнение к копированию, dosflp также выдает список файлов, ко-
торые имеются на гибком диске DOS, и удаляет файлы с гибкого диска. Эти
функции легко реализовать, потому что как только один раз процедура
доступа написана, добавить новые команды для выполнения операций над
файлами довольно просто.
Обычно мы хотим управлять файлами определенного типа как группой.
Сюда относятся ассемблерные исходные файлы, исходные файлы на языке C и
файлы-заголовки на языке C. Поэтому, чтобы снять с вас обязанности по
вводу универсальных символов для этих типов файлов, мы прямо указываем
их в качестве опций команды dosflp. Например, ключ -a копирует только
файлы, которые оканчиваются на .asm, поэтому нет необходимости помнить
вид выражения для копирования этих файлов. Аналогично, ключ -c копирует
все файлы, оканчивающиеся на .c, и ключ -h копирует файлы, оканчивающи-
еся на .h.
Как мы увидим позже, прямое указание, о котором мы говорим здесь,
являеется выражением для команды grep. Использование всех возможностей
команды grep достигается при указании образцов имен файлов.
Используйте ключ -d для указания, с какого гибкого диска произво-
дится копирование. По умолчанию это устройство a: или A:. Не имеет зна-
чения, на каком регистре вы укажете имя устройства. Для уверенности
проверьте файл /etc/default/msdos. Этот файл содержит соответствия меж-
ду символом устройства и маршрутным именем XENIX. Например, файл может
выглядеть так:
A=/dev/fd048ds9
B=/dev/fd148ds9
C=/dev/hd0d
D=/dev/hd1d
X=/dev/fd096ds15
Y=/dev/fd196ds15
Как вы видите, маршрутные имена - это обычные имена устройств и
ничего больше.
В качестве основного средства выполнения работы dosflp использует
команду doscp. Это утилита способна понимать формат файловой системы
DOS. Dosflp передает ей обозначение устройства и другие опции
посредством переменных командного процессора. Например, ключ "-dB:" ме-
няет устройство на B вместо принятого по умолчанию устройства A.
Если выражения прямого указания типа файлов не соответствуют тому,
что вам нужно, вы можете определить свои собственные выражения со-
поставления, используя ключ -e. Напомним, что выражение должно соот-
ветствовать синтаксису команды grep. Если вы хотите освежить свою па-
мять, посмотрите grep(1) в руководстве по AT&T UNIX или grep(C) в руко-
водстве по XENIX. Для получения полной информации о синтаксисе посмот-
рите ed(1). Этот синтаксис является основой большинства команд, работа-
ющих с регулярными выражениями, таких как sed и grep.
Например, если вы используете выражение "*test*", выражение для
grep должно иметь вид ".*test.*". Его можно слегка изменить в зависи-
мости от того, что вы желаете иметь с каждой стороны цепочки test. В
данном случае синтаксис указывает все символы (.*), за которыми следует
цепочка t-e-s-t, а затем любая цепочка символов (.*). В этом случае
ключ имел бы вид "-e.\*test.\*". Это кажется немного странным, но это
соответствует синтаксису. (Двойные кавычки не являются частью команды.)
Символ обратной косой черты (\) используется для экранирования звездоч-
ка. Если вы не экранируете ее, командный процессор соотнесет ее с име-
нами всех файлов вашего текущего каталога, чего вы не желаете. Экрани-
рование ее позволит, чтобы нужный символ был передан dosflp, для
использования ее в grep-последовательности.
Ключ -h - это еще один из ключей прямого указания. Давайте вкратце
рассмотрим его синтаксис внутри dosflp. Это ".*\.h$", и он указывает
любой символ, за которым стоит одно или несколько вхождений любого сим-
вола (.*), литеральная точка (.\), символа h и вслед за ним конец стро-
ки (h$). Вы могли бы указать то же самое, используя ключ -e, но -h де-
лает это гораздо легче.
Ключ -l изменяет основное действие команды dosflp. Вместо копиро-
вания файлов он выдает список файлов. Это делается путем выполнения
различных команд вида dosxx, в данном случае dosdir. Ключ выдачи списка
полезен в dosflp, потому что вы можете получить список как информацию к
решению о том, что делать дальше, и вам нет необходимости помнить ко-
манду dosdir.
Ключ -r также изменяет основную операцию команды dosflp. В этом
случае файлы удаляются, а не копируются. Если вы указали этот ключ, вы-
дается сообщение, которое просит вас подтвердить, что вы хотите удалить
указанные файлы. Вы можете просто ответить "n", и запретить удаление,
если вы ввели этот опцию случайно. Напомним, что удаленные файлы или
файлы, включенные в список (в случае ключа -l), выбраны выражением
grep, которое жестко запрограммировано или указано пользователем. По
умолчанию выбираются ВСЕ файлы. Для ключа -r это соответствует тому,
что сказать "rm *".
Последний ключ, -s, обеспечивает возможность доступа к файлам, ко-
торые размещены внутри подкаталога на гибком диске DOS. Если вы обраща-
етесь только к имени устройства, по умолчанию ключ -s относится к ката-
логу самого верхнего уровня на гибком диске. Если нужный вам файл нахо-
дится в подкаталоге, вы должны использовать определенную нотацию, чтобы
попасть в него. Одно из различий между XENIX и DOS заключается в симво-
ле, используемом для разделения элементов маршрутного имени. XENIX
использует обычную запись в стиле UNIX - /x/y/z. В DOS применяется сим-
вол "обратная косая черта", т.е. \x\y\z. Но если вы хотите использовать
команды XENIX на гибком диске DOS, вы должны применять обычную запись
XENIX, a:/x/y/z. Это не совсем понятно, но правильно.
По умолчанию, dosflp копирует файлы с гибкого диска в
ваш текущий каталог на жестком диске. Если вы измените операцию на
выдачу списка или удаление, эта операция будет произведена на гибком
диске.
Примеры
1. $ dosflp -dB: -c -l
Выдает список всех файлов вида *.c на гибком диске DOS, размещен-
ном в устройстве B. В этом случае не происходит переход вниз в подката-
логи, а включаются лишь файлы, размещенные на верхнем уровне каталогов.
2. $ cd /destdir
$ dosflp -ssrc -e.\*src.\*
Переход в каталог, куда будут помещены файлы. Копируются файлы с
гибкого диска DOS (устройство A, подкаталог src), в текущий каталог.
Файлы для копирования указаны как *src*. В записи UNIX это выглядело бы
так: "cp A:/src/*src* .".
3. $ dosflp -r -stmp
Удаляет все файлы, размещенные в подкаталоге tmp на гибком диске
DOS (устройство A). Обратите внимание, что сам каталог не удаляется. В
записи UNIX это выглядело бы так: "rm A:/tmp/*".
4. $ sh -x `path dosflp` -dB:
Запускает процедуру dosflp в отладочном режиме выполнения.
Единственное ограничение при таком вызове командного процессора заклю-
чается в том, что файл данных, который вы посылаете ему (в данном слу-
чае dosflp), должен иметь полное маршрутное имя. Поскольку командный
процессор НЕ выполняет поиск маршрутного имени файла, нам необходимо
сперва найти маршрутное имя dosflp, затем передать его командному про-
цессору, запущенному в отладочном режиме выполнения, а также передать
процедуре dosflp аргумент в командной строке. Заметьте, что вызов
dosflp таким путем не меняет значение переменной $#, которое только
распознает ключ -dB: как аргумент.
Пояснения
Строки 4-6 выполняют инициализацию по умолчанию путем сохранения
значений в соответствующих переменных командного процессора. По умолча-
нию символ-шаблон ставится в соответствие всем файлам, указанным выра-
жением для команды grep .\*. Обратная косая черта требуется для экрани-
рования звездочки, поэтому она не перехватывается командным процессо-
ром. Устройство по умолчанию - A:. Операция по умолчанию - копировать
файлы, что указано значением "c" для переменной опции.
В строках 8-25 устанавливаются значения ключей и производится про-
верка на наличие ошибок. Если командная строка имеет некоторые аргумен-
ты ($# -gt 0), мы перебираем каждый аргумент и проверяем его. Если най-
ден допустимый ключ, переменные устанавливаются согласно ключу. Если
обнаружен недопустимый ключ, выдается сообщение об ошибке и программа
завершается с плохим статусом возврата.
Имеется два важных типа ключей. Ключи, которые выполняют прямое
указание типа файла, просто устанавливают переменную EXP в соответствии
с ключом. Аналогично, ключи, которые определяют, какой вид работы будет
выполняться процедурой, просто устанавливают соответствующую переменную
OP. Другие ключи должны обрабатываться путем извлечения одного или
нескольких символов из командной строки, которые следуют за флагом клю-
ча, эхо-отображения и конвейерной пересылки текущего аргумента ARG ко-
манде cut для извлечения символа (символов), начинающихся с третьего
символа аргумента, затем присвоения результата этой операции соот-
ветствующей переменной.
Из всего сделанного следует вывод, что пробелы между ключами и
символами, которые стоят за ними, не допускаются. Например, ключ -d
должен получить имя устройства. По синтаксису должно быть -dB:, но не
-d B:, потому что B: интерпретировалось бы как другой аргумент ARG в
цикле for, а это все испортит.
В строках 27-39 операция, которая должна быть выполнена, определя-
ется при помощи следующего оператора case. Если должно быть выполнено
копирование, выдается сообщение "copying" и выполняется то, что следует
за оператором case. Если должен быть выдан список файлов, выдается
сообщение об устройстве, содержимое которого должно распечататься, за-
тем выдается список файлов путем выполнения команды dosdir и конвейер-
ной пересылки результата команде more, после чего dosflp завершается.
Если файлы должны быть удалены, пользователю выдается запрос на
подтверждение удаления. Если ответ "yes", выдается сообщение, с какого
устройства файлы будут удалены. Если ответ "no", dosflp завершается.
Остаток командного файла имеет дело с механизмом копирования.
Строка 41 - это первый шаг в наведении моста над пропастью между двумя
типами носителей. Команда dosls использована для получения полного
списка файлов с гибкого диска. Перед тем как мы передадим этот список
во временный файл, мы пропустим его через команду tr (translate), кото-
рая преобразует все символы на нижний регистр, чтобы при копировании
файлов их имена были в нижнем регистре. В результате копии будут поме-
щены на диск XENIX с именами файлов в нижнем регистре. Если у вас есть
файлы с именами в верхнем регистре или в смеси регистров, вы должны
вручную исправить их после копирования.
Строки 43-50 выполняют само копирование. Цикл for запускается для
доступа к каждому файлу индивидуально. Это требование команд вида
dosxx. Вы должны получать доступ к одному файлу один раз, поскольку
этот уровень не обладает возможностью указания символа-шаблона. Имена
файлов, которые использует цикл for, определены путем использования ко-
манды grep для выбора имен соответственно выражению, установленному ра-
нее.
Имя каждого выбранного файла сначала отображается, так что пользо-
ватель может видеть, выполняется ли команда так, как ожидалось. В этом
месте мы можем сделать одну из двух вещей: или копировать файлы, или
удалить их. Эта операция определяется оператором case в строках 46-49.
Если операция - копирование файлов, файлы копируются из комбинации уст-
ройство-файл в текущий каталог. Обратите внимание, что в переменную
DRIVE включается подкаталог, если он был указан в командной строке. Это