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

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

Содержание


Возможные модификации командного файла
Подобный материал:
1   ...   8   9   10   11   12   13   14   15   ...   45

копировать все файлы из каталога /bin в текущий каталог. Обратите вни-

мание, что результирующими файлами будут /mnt/*, что может не совпадать

с вашим желанием.

2. $ cd /bin

$ cptdir . /mnt/bin

То же, что и в предыдущей команде, но обратите внимание, что точка

изменила свою позицию. Команда указывает копирование всех файлов теку-

щего каталога в каталог /mnt/bin. Получаются файлы /mnt/bin/*, что выг-

лядит более резонным.

3. $ cptdir /bin /mnt

То же, что и в примере 1.

4. $ cptdir /bin /mnt/bin

То же, что и в примере 2.


Пояснения


В строках 4-9 производится проверка аргументов командной строки.

Если указано меньше двух аргументов, этого недостаточно. Как минимум

должны быть указаны имена каталога-источника и каталога-приемника. Бо-

лее трех аргументов слишком много. Самое большее, там должны быть опция

-s, каталог-источник и каталог-приемник.

В строках 11-15 устанавливаются ключи команды cpio. По умолчанию

это pdv, что означает "pass" (передача) для копирования в формате фай-

ловой системы (в отличие от необработанного потока данных), "directory"

(каталог) для создания каталога при необходимости и "verbose" (мно-

гословный) для выдачи имен файлов по мере их копирования. Если первым

позиционным параметром является ключ -s, который указывает запуск

cptdir в молчаливом режиме, ключи команды cpio не содержат ключа выдачи

сообщений и, таким образом имена файлов не выдаются на экран.

Строки 17,18 и 19 устанавливают каталоги "откуда" и "куда" и уста-

навливают переменную umask в 0. Переменная umask определяет подразуме-

ваемые права доступа для всех файлов, созданных нашим командным про-

цессором. Мы изменяем umask для гарантии того, что все файлы копируются

в дерево-приемник и ни один из них не будет заблокирован из-за

отсутствия прав чтения или записи. Побочным эффектом является то, что

все каталоги имеют права доступа вида rwxrwxrwx, а все файлы - вида

rw-rw-rw-, что может потребовать изменений для обеспечения вашей безо-

пасности. Изменение umask имеет действие только на время работы проце-

дуры. Когда cptdir завершается, umask вашего вызывающего командного

процессора остается неизменным.

Строки 21-29 выполняют проверку каталога-приемника. Если он уже

существует, вас запрашивают, нужно ли его удалить и заново создать.

Если он не существует, он создается для работы cpio.

Строки 31-36 выполняют непосредственно копирование. Прежде чем

объяснить, что здесь делается, давайте сперва посмотрим, как работает

cpio. Поскольку оператор find генерирует список файлов, нам необходимо

представлять, как его выход может влиять на выполнение cpio.

Если мы указали "find . -print", то полные имена файлов будут

иметь точку впереди, например:

./dir

./dir/file1

./dir/file2

Это относительная нотация, которая очень полезна, когда вы не хо-

тите, чтобы ваши файлы передавались согласно абсолютным маршрутным име-

нам, но хотим сохранить их взаимосвязь друг с другом. Если на них ссы-

латься относительно точки, то место, куда они будут помещены, может

быть, где угодно. Однако, если мы скажем "find /dir -print", список бу-

дет выглядеть так:

/dir

/dir/file1

/dir/file2

В обоих случаях мы ссылаемся на наш текущий каталог, но применение

записи вида /dir заставляет полное имя начинаться с "/" и не допускает

использование относительной нотации. Передача такой же информации ко-

манде cpio может радикально изменить место размещения ваших файлов.

Например, если я сказал "cd /src; find . -print | cpio -pdv /dest", ре-

зультирующий список будет таким:

/dest/./dir

/dest/./dir/file1

/dest/./dir/file2

где на первом месте стоит, вероятно, то, что вы хотели. Однако,

если я сказал "find /src -print | cpio -pdv /dest", результирующие

маршрутные имена будут такими:

/dest/src/dir

/dest/src/dir/file1

/dest/src/dir/file2

что не очень хорошо, поскольку это создает уровень каталога, в ко-

тором нет необходимости. Заметьте, что имя каталога "src" было перехва-

чено при распечатке. Это произошло потому, что его выдал find, а cpio

считает, что src было частью имени каталога-приемника.

Повсеместное использование относительной нотации может привести

нас к потере уже имеющейся информации. Например, если бы я сказал "cd

/nowhere; find /src ....", каталог-приемник получил бы неверное имя. Мы

должны уметь использовать этот тип нотации и не попадать в ловушки син-

таксиса. Это и есть то, что делает cptdir.

В строке 31 производится проверка на то, является ли первый символ

в маршрутном имени целевого каталога символом "косая черта" ("/"). Если

да, то мы точно знаем, что имя каталога-приемника выражено в виде абсо-

лютного маршрутного имени, поэтому мы можем сменить каталоги без потери

информации о нашем текущем каталоге. В строках 32-33 мы переходим в ка-

талог-источник и копируем файлы.

Но если первый символ каталога-приемника НЕ является наклонной

чертой, используемая нотация является относительной. Это значит, что

если мы сменим каталог, мы потеряем информацию о том, где мы находи-

лись, когда был запущен командный файл. Чтобы избежать этого, мы полу-

чаем в строке 34 полное имя текущего каталога путем перехвата вывода

команды pwd и присвоения этого значения переменной таким образом, что

позже мы сможем ее восстановить. Затем мы переходим в каталог-источник

и копируем файлы, используя префикс абсолютного маршрутного имени от

команды pwd и относительный суффикс того места, где мы находимся.

Причиной того, что мы так поступаем, является использование от-

носительной (точечной) нотации в операторе find. Как можно было видеть

в предыдущем описании, отказ от использования точечной нотации может

привести к путанице в маршрутных именах каталога-приемника. Для того

чтобы всегда использовать точку в операторе find, нам необходимо убе-

диться, куда мы собираемся пересылать файлы. Еще раз напомним, что ко-

манда cd действует только для данного командного процессора "низкого"

уровня, поэтому она не влияет на тот командный процессор, который за-

пустил командный файл. Вообще, командный файл должен оставить пользова-

телей в тех же условиях, в которых они находились перед его запуском,

за исключением выполнения необходимых работ, при которых не произво-

дится смена текущего каталога.

Когда cptdir завершается, управление возвращается вызывающему ко-

мандному процессору, который по-прежнему ведет свой собственный текущий

каталог. Напомним, что всегда, когда вы переходите на более низкий уро-

вень командного процессора, экспортируемые переменные передаются вниз,

но НИЧЕГО не передается наверх.


ВОЗМОЖНЫЕ МОДИФИКАЦИИ КОМАНДНОГО ФАЙЛА


В нынешней реализации никакие дополнительные ключи не допускается

передача никаких дополнительных ключей команде cpio. Что случится, если

вы захотели заменить копирование файлов, где это возможно, созданием

ссылок (ключ -l) или не менять время последнего доступа к исходному

файлу при его копировании (опция -a)? Такие возможности были бы недо-

пустимы.

Можно легко добавить возможность передачи дополнительных аргумен-

тов. Они должны быть опознаны как аргументы, сохранены и затем выбраны

из командной строки.

Для этого потребуется такой цикл:

for ARG in $*

do

if [ "`echo $ARG|cut -c1`" = "-" ]

then CPIOARG="CPIOARG $ARG"

shift

fi

done

Затем переменная CPIOARG может быть передана команде cpio.

Еще одна область, где могут быть произведены изменения - это уп-

равление правами доступа к файлам. Как объяснялось ранее, значение 0

для umask делает все права такими, что они разрешают запись. Если это

вам не подходит, оператор find может быть изменен так, что будет произ-

водиться выборочное копирование (и изменение прав доступа).

Предположим, например, вы имеете каталог с двумя файлами. Если вы-

полнился оператор "find /dir -print", список файлов будет таким:

/dir

/dir/file1

/dir/file2

Обратите внимание, что имя каталога появляется первым. Проблема

возникает, если имя каталога не принадлежит вам или вы не имеете права

записи. Происходит следующее: имя каталога копируется первым, устанав-

ливаются права доступа (блокируя вас) и после этого file1 и file2 не

могут быть скопированы в каталог dir. В cptdir мы применяем решение из-

менить umask так, чтобы вы всегда имели права записи. Это своего рода

клудж, но он работает.

Другой путь - это изменить оператор find. Выполнение оператора

"find /dir -depth -print" сгенерирует такой список файлов:

/dir/file1

/dir/file2

/dir

Обратите внимание, что имя каталога стоит ПОСЛЕДНИМ! Это правиль-

но. Ключ -depth переворачивает список файлов так, что имя каталога пе-

чатается последним.

Что это дает? Фокус в том, что сначала копируются file1 и file2, а

затем устанавливаются права доступа данного каталога. Вы можете за-

писать файлы в каталог, для которого вы не имеете права записи. Благо-

даря тому, что файлы копируются первыми, вы можете не беспокоиться о

том, какого рода права доступа имеет этот каталог. К сожалению, ключ

-depth команды find поддерживается не всеми версиями системы UNIX.


3.2.2. can - удаление файлов в "мусорную корзину"


------------------------------------------------------------------------


Имя: can

______________________________________________________________________

can Управление "мусорной корзиной" файлов


НАЗНАЧЕНИЕ


Перемещает файлы в "мусорную корзину", симулируя их удаление. Это

допускает восстановление файлов после их кажущегося удаления.

Формат вызова

can [-l] [-r] file [file ...]

Пример вызова

can junk Посылает файл junk в "мусорную корзину"

Исходный код для can

1 :

2 # @(#) can v1.0 Maintain file trash can Author: Russ Sage


4 CAN=$HOME/.trashcan


6 if [ ! -d $CAN ]

7 then mkdir $CAN

8 fi


10 if [ "`echo \"$1\"|cut -c1`" = "-" ]

11 then case $1 in

12 -l) echo "$CAN:"

13 ls -al $CAN

14 exit 0;;

15 -r) echo "removing $CAN/*:"

16 rm -rf $CAN/*

17 exit 0;;

18 -z|-?) echo "usage can [-l] [-r] file [file ...]" >&2

19 exit 0;;

20 esac

21 fi


23 mv $@ $CAN


Переменные среды выполнения


CAN Положение каталога "мусорной корзины"

HOME Положение вашего регистрационного каталога


Описание

Зачем нам нужен can?


По большому счету система UNIX, при всем ее великолепии, является

просто структурой для накопления и манипулирования данными в файлах.

Как мы отмечали раньше, эта система включает сотни файлов. Некоторые

файлы вы желаете хранить неопределенно долго, в то время как другие

отслужили свое и создают беспорядок на диске. К несчастью, легко выб-

росить то, что в действительности вы хотели сохранить. Команду rm со-

вершенно не украшает то, что она является печью для сжигания мусора:

бросьте что-нибудь в нее и оно пропадет (если только вы не имеете ко-

пии, а восстановление копии - это трудоемкая работа). Вот несколько

классических примеров неверного применения команды rm:

rm * /tmp <-- Удалить все файлы в каталоге /tmp

Мы хотели сказать rm /tmp/*, а на самом деле произошло сначала

удаление всех файлов в текущем каталоге, а затем попытка удалить /tmp.

Последнее будет безуспешным, поскольку tmp - это каталог. В результате

мы удалили все, что хотели сохранить, и сохранили все, что хотели уда-

лить! Этот синтаксис похож на другие операторы UNIX, вроде "grep *

file": противная ошибка.

rm -rf / tmp <-- Удалить каталог tmp со всеми файлами

Мы хотели сказать rm -rf /tmp, но нечаянно вставили пробел в ко-

манду. На самом деле удалятся ВСЕ файлы во всей системе (если мы дадим

команде выполняться достаточно долго), потому что мы сказали UNIX уда-

лить корневой каталог и всех его потомков! Вы должны быть внимательны с

командой rm. Если покажется, что что-то не так, удалите эту команду.

Она может погубить вас.

Одна такая ошибка может испортить вам целый день. После того, как

это случится, вы станете осторожным на некоторое время, потом внимание

ослабнет. Если вы не будете бдительным, ошибки вернутся, чтобы пресле-

довать вас.

Для нас "мусорная корзина" более желательна, чем печь для сжигания

"мусора". Используя этот путь, вы можете вернуться и восстановить то,

что вы выбросили по ошибке. Вы также хотели бы контролировать, когда

появится мусоросборщик, захватит и окончательно удалит "мусор". Вы мо-

жете периодически просматривать содержимое "мусорной корзины", а затем

очищать корзину, когда вы уверены, что вы не хотите ничего в ней сохра-

нять. Нельзя допускать, чтобы корзина была слишком заполнена, потому

что она занимает дисковое пространство.


Что делает can?


Командный файл can предназначен для управления "мусорной корзиной"

ваших файлов. Используя утилиту, вы можете свести к минимуму случайные

потери во время работы и даже впоследствии восстанавливать файлы при

необходимости.

Can не только помещает ваши файлы в "мусорную корзину", но и пока-

зывает вам, что в ней в настоящее время находится и очищает ее, когда

вы этого хотите.

Can распознает только ключи -l и -r. Ключ -l показывает, что нахо-

дится в "мусорной корзине", а -r удаляет все ее содержимое. Запомните,

что если вы что-то удалили из "мусорной корзины", вы не сможете его

восстановить.

Процесс помещения файлов в "мусорную корзину" выполняется командой

mv. Ключи, предназначенные для can, должны быть первым аргументам в ко-

мандной строке. Если вы желаете передать ключи команде mv, то их можно

поместить в любом месте командной строки. Единственные ключи, дающие

синтаксическую подсказку, - это -z и -?. Их предназначение - быть фла-

гами только для обработки ошибок. Благодаря наличию специальных флагов

обработки ошибок, выдающих справочную (help) информацию, ключи команды

mv, как и ключи can, можно помещать первыми в командной строке, не ока-

зывая влияния на can. Если вы создаете ваши командные файлы так, чтобы

эти ключи всегда выдавали информацию об использовании (т.е. никогда не

были "настоящими" ключами), то вы имеете хороший способ получения помо-

щи по синтаксису. Многие (но, увы, не все) стандартные команды UNIX да-

ют по ключам -z или -? подсказку об использовании и это полезно помнить

всякий раз, когда вы попали в тупик.

Если can не получает никаких ключей, действие по умолчанию заклю-

чается в пересылке всех указанных файлов в "мусорную корзину", разме-

щенную в вашем регистрационном каталоге под именем $HOME/.trashcan.

Если этот каталог отсутствует, он автоматически создается при первом

выполнении командного файла can. Это позволяет вам запускать команду,

не указывая специального положения "корзины". Если вы применяете ключ

-r, файлы в "мусорной корзине" будут удалены, а сама она нет.

Примеры

1. $ can *.c

Перемещает все файлы, которые оканчиваются на .c, в "мусорную кор-

зину".

2. $ can -l

Выдает список всех файлов, размещенных сейчас в "мусорной корзи-

не".

3. $ can -r

Удаляет все файлы из "мусорной корзины".

4. $ can -q *

Передает ключ -q команде mv. Поскольку это недопустимый ключ ко-

манды mv, она выдает сообщение об ошибке и завершается.

Пояснения

Строка 4 устанавливает место "мусорной корзины" так, чтобы она

размещалась в вашем регистрационном каталоге под именем .trashcan. За-

метьте, что ее именование, начиная с точки, делает ее нераспечатывае-

мым, или скрытым файлом. Единственный способ увидеть такие файлы -

использовать ключ -a в команде ls.

Строки 6-8 проверяют, определен ли сейчас каталог "мусорной корзи-

ны". Если нет, он создается. Обратите внимание, что поскольку его соз-

даете вы, он имеет такие права доступа на чтение и запись, как в вашем

регистрационном каталоге.

Строки 10-21 проверяют, начинается ли первый позиционный параметр

с черточки (-). Если такой параметр обнаружен, проверяется, является ли

он ключом командного файла can (-l, -r, -z или -?). Обратите внимание,

что для того, чтобы для использования двойных кавычек внутри двойных

кавычек (строка 10), вы должны экранировать кавычки. Символ обратной

косой черты (\) использован именно для этой цели.

Если указан ключ -l, выдается напоминание об имени каталога

"мусорной корзины", команда ls выводит список файлов в "мусорной корзи-

не" и процедура can завершается, поскольку требовалось только вывести

список.

Если указан ключ -r, выдается сообщение об имени каталога очищае-

мой "мусорной корзины" и файлы в ней удаляются командой rm. Это разру-

шительная вещь и удаляет ваши файлы навсегда. После удаления can завер-

шает работу. Вы можете дополнить программу процедуры так, чтобы давать

подтверждение перед выполнением команды, если это позволит вам чувство-

вать себя более спокойно.

Если указан ключ -z или -?, выдается подсказка об использовании и

can завершается. Это не совсем хорошо, но мы не можем использовать сим-

вол *, соответствующий любому другому ключу, поскольку ключ может быть

предназначен для команды mv, а не для can. Благодаря использованию все-

го двух аргументов для обработки ошибок, мы можем разрешить передачу

всех остальных аргументов. Если ключ не является одним из ключей can,

или одним из указанных ключей обработки ошибок, то он передается коман-

де mv. Если ключ недопустим для этой команды, команда mv выдает свое

сообщение об ошибке и завершает работу. Вы можете, естественно, модифи-

цировать командный файл так, чтобы он проверял допустимость ключей ко-

манды mv на "внешнем" уровне. Тогда он может выдать сообщение об ошибке

и завершиться, если указанный ключ недопустим ни для can, ни для mv.

Вопрос в том, стоит ли платить за более полный контроль над обработкой

ошибок ценой разбухания программы и временем исполнения.

Строка 23 выполняет собственно перемещение файлов в "мусорную кор-

зину". Заметьте, что это выполняется только если не указаны никакие

ключи can, поскольку это поведение can, принятое по умолчанию. Здесь

используется параметр $@. Путем включения всех параметров в командную

строку, любые ключи, предназначенные команде mv, передаются ей. Таким

способом мы можем изменить путь, которым файлы посылаются в "мусорную

корзину".


3.2.3. dosflp - копирование файлов с гибкого диска формата MS-DOS

с использованием символов шаблона в именах файлов


------------------------------------------------------------------------


Имя: dosflp

_____________________________________________________________________

dosflp Копирование файлов с гибкого диска формата DOS с

использованием символов шаблона в именах файлов


НАЗНАЧЕНИЕ


Копирует файлы с гибкого диска в формате DOS (в XENIX) на жесткий

диск. Обеспечивает возможность использования записи с помощью симво-

лов-шаблонов для имен файлов на гибком диске, где такая запись обычно