Даже "небольшая" система UNIX с малым числом пользователей порождает сотни файлов в ходе обычной работы. В процессе программирования вы можете создавать множество файлов для различных версий ваших программ. Ведение почты и запись текста при помощи редактора vi способствует тому, что накапливается еще больше файлов. Такие утилиты, как uucp, lp и другие добавляют еще больше файлов. Если у вас система UNIX установлена на микро-ЭВМ, то ваш жесткий диск начинает переполняться. В больших многопользовательских системах дисковая память редко считается проблемой, но в действительности всегда кажется, будто файлы стремятся расшириться до заполнения всей доступной дисковой памяти. Поэтому каждый пользователь должен нести ответственность за расход дискового пространства. (Если вы платите за дисковую память, то у вас также могут быть финансовые стимулы.) Однако, то, что вы хотите сохранить, вы хотите СОХРАНИТЬ. Именно здесь начинается работа по созданию резервных копий.
В предыдущей главе мы разработали некоторые средства поиска и отображения информации, помогающие нам поддерживать жизненный путь всех наших файлов. Теперь мы собираемся обратиться к важнейшим рутинным работам, которые позволят избежать хаоса и катастрофы.
Сопровождение файлов означает избавление от файлов, которые нам больше не нужны и в то же время систематическое копирование тех файлов, которые мы хотим сохранить. Для этого требуется возможность использования разнородных доступных носителей данных. Сопровождение файлов подразумевает также ряд систематических, повторяющихся задач, а это означает, что мы можем создать средства системы UNIX для автоматизации этого процесса.
Сопровождение файлов включает два вида операций: создание резервных копий (копирование) и удаление "мусора".
Копирование - это дань уважения, которую мы платим за хрупкость физических данных в руки Мерфи и других богов энтропии. Хорошее средство копирования является быстрым, гибким, простым в использовании и стимулирует пользователей часто копировать самые важные файлы. В последующем тексте будут представлены различные методы копирования, пригодные для разных конфигураций системы и типов носителей.
Имеется два вида резервных копий: "мягкие" и "твердые". "Мягкие" резервные копии - это копии в другом файле или каталоге в той же или в другой файловой системе (т.е. разделе) на том же или другом жестком диске. Такого рода копирование сделать легко и оно предохраняет от наносимого самому себе ущерба, такого как удаление файла по невнимательности. Чаще всего для такого типа копирования используется наше средство cptdir. Основной недостаток мягкого копирования заключается в том, что вы по-прежнему уязвимы для таких воздействий, которые влияют на ваш физический носитель (обычно жесткий диск) так, что и оригинал и копия оказываются разрушенными.
"Твердая" копия - это копия на другом устройстве или даже в другой системе UNIX. Средства, представленные ниже в данной главе, управляют такого рода копированием и дают вам возможность выполнять копирование такого типа и с такой периодичностью, которые соответствуют объему вашей вычислительной системы, уровню ее активности и важности хранимых данных.
Твердое копирование всегда несколько утомительно, потому что диски или ленты должны быть смонтированы (или должна быть установлена связь с другой системой), а эта операция требует много времени. Преимущество, естественно, заключается в том, что вы больше не зависите от целостности какого-либо одного устройства.
Автоматизируя нашу процедуру копирования, мы стараемся сделать его как можно менее болезненным. Делая наши средства копирования в какой-то степени разумными, мы можем выбрать только файлы, которые нуждаются в копировании, и тем самым сохранить время и память. Наилучший способ обеспечить, чтобы копирование выполнялось регулярно - минимизировать время и требуемые для этого усилия. Наконец, создание процедур для проверки правильности копий даст вам спокойствие духа.
"Удаление мусора" можно автоматизировать путем указания и подготовки к удалению файлов, которые, вероятно, будут временными, либо каких-то других файлов, которые созданы (но не обязательно разрушены) при компиляции, выполнении конвейеров или другими операциями. Вы также можете указывать файлы, специфичные для ваших работ как не подлежащие удалению.
Первая группа средств - это простые универсальные переносчики файлов. Программа cptdir может копировать каталог (и любые подчиненные каталоги, лежащие ниже в дереве) в каталог-приемник. Каталог-приемник это обычно каталог, назначенный в качестве резервной копии для некоторого проекта. Программа can берет на себя необходимую рутинную работу - убирает "мусор". Эта программа позволяет вам выбрать типы временных файлов, которые должны периодически удаляться. Направляя их в "мусорный" каталог, can предоставляет вам возможность просмотреть все, что было удалено, и восстановить то, что вы на самом деле хотите сохранить.
Программа dosflp допускает применение символов-шаблонов в именах файлов, используемых при копировании отобранных файлов с дискет формата MS-DOS в XENIX. Это упрощает операцию копирования и уменьшает число нажатий на клавиши.
Далее представляется "рабочая лошадка" - средства копирования. Autobkp использует список маршрутных имен, чтобы определить, какие части файловой системы должны быть проверены. Затем эта программа копирует из выбранных областей те файлы, которые были добавлены или изменены в последние 24 часа.
Cpiobr предоставляет интерактивное дополнение к команде cpio системы UNIX. Она позволяет вам скопировать файлы с жесткого диска на гибкий и, если необходимо, восстановить их с гибкого диска на жесткий.
Выполнение копирования не избавит вас от волнений, пока вы не будете знать, что вы скопировали все, что хотели, и что копирование прошло корректно. Программа dsum использует контрольную сумму для проверки того, что исходный каталог и каталог-копия содержат одни и те же файлы.
Программа log отображает регистрационный файл, чтобы показать, какое автоматическое копирование выполнялось в четыре часа утра, когда вы (надеемся) спали.
При создании этих средств мы просмотрим некоторые важные команды системы UNIX и обнаружим новые способы их использования. Когда вы проработаете всю данную главу, вы будете знать, как работать "с мельчайшими частицами" при использовании файловой системы UNIX. Вы сможете автоматизировать иную большую область ваших компьютерных будней. Вы должны суметь создать пользовательские утилиты копирования и верификации, удовлетворяющие вашим нуждам. Вы сможете перевести вашу систему в режим работы, обеспечивающий ей самостоятельное выживание. (Мы оставляем философам определять, даст ли это вашему компьютеру примитивную форму жизни!)
Между прочим, многие средства в данной главе пользуются преимуществами рекурсивных методов обхода дерева, которые мы разработали в предыдущей главе. Вы можете просмотреть тот материал, если у вас имеются затруднения в понимании того, что представлено здесь.
ИМЯ: cptdir
cptdir Копирует дерево каталога в другое место
Копирует дерево файловой системы, корень которого расположен в каталоге, в другой каталог системы. Нет ограничений на какой-либо специфический каталог или жесткий диск.
cptdir [-s] каталог-источник каталог-приемник
cptdir $HOME /bkp
Копирует каждый файл из $HOME в каталог /bkp.
1 : 2 # &(#) cptdir v.1.0 Copy a directory tree Autor: Russ Sage 4 if [ $# -lt 2 -o $# -gt 3 ] 5 then echo "cptdir: argument error" >&2 6 echo "usage: cptdir [-s] srcdir desdir" >&2 7 echo " -s silent mode" >&2 8 exit 1 9 fi 11 if [ "$1" ="-s" ] 12 then OPT="-pd" 13 shift 14 else OPT="-pdv" 15 fi 17 SRC=$1 18 DEST=$2 19 umask 0 21 if [ -d $DEST ] 22 then echo "\"$DEST\" already exist. Remove it? (y/n): \c" 23 read CMD 24 if [ "$CMD" = "y" ] 25 then rm -rf $DEST 26 mkdir $DEST 27 fi 28 else mkdir $DEST 29 fi 31 if [ "`echo $DEST|cut -c1`" = "/" ] 32 then cd $SRC 33 find . -print | sort | cpio $OPT $DEST 34 else PWD=`pwd` 35 cd $SRC 36 find . -print | sort | cpio $OPT $PWD/$DEST 37 fi
CMD | Команда, полученная от пользователя |
DEST | Каталог-приемник, в который нужно копировать |
OPT | Опции, которые передаются утилите cpio |
PWD | Текущий рабочий каталог |
SRC | Каталог-источник, из которого нужно копировать |
Зачем нам нужен cptdir?
Мы уже отмечали необходимость в дополнительных командах, которые рекурсивно обходят древовидную структуру файловой системы UNIX. В ранних версиях UNIX единственная команда tar могла управлять движением по дереву. В более новых версиях системы имеется опция -r в команде cp, которая делает cp рекурсивной (эта возможность реализована только в последней версии System V) и команда cpio. Последняя является многоцелевой командой копирования, которая может иметь дело как с потоковым форматом, так и с форматом файловой системы.
Проблема при использовании даже таких улучшенных стандартных команд системы UNIX состоит в том, что вам необходимо указать множество деталей и убедиться в том, что вы правильно используете синтаксис.
Ошибки могут привести к потере времени и даже хуже того, к неожиданным побочным эффектам. С некоторыми из этих эффектов связаны изменения прав доступа и владельца, порядок распределения индексных дескрипторов файлов (inode), размещения файлов-приемников и результирующие полные имена. Очень много необходимо запомнить и заново вызывать каждый раз при копировании. Поскольку такое копирование делается не часто, тяжело запомнить все эти детали. Мы разрешаем эту проблему, автоматизируя детали процесса и в то же время предоставляя пользователю гибкость и управление результатами. Мы создаем инструменты для управления файлами, которые являются хорошими дополнительными средствами к основным командам системы UNIX.
Что делает cptdir?
Процедура cptdir копирует каталог (и все дерево под ним, если оно существует) в другой каталог системы. Поскольку каталоги предусматривают логический доступ и не являются аппаратно-зависимыми (в отличие от имен устройств), то вы можете легко копировать файлы в другое место на том же диске или копировать их на другой диск полностью без специального синтаксиса или опций.
Вы можете указать, хотите ли вы, чтобы на экран выводились имена копируемых файлов. Если вы не хотите этого, используйте опцию -s ("silent" - молчаливый). По умолчанию используется режим "verbose" (многословный), который отображает имена по мере копирования файлов.
Заметьте, что это копирование, а не перемещение файлов. Недостаток копирования в отличие от перемещения заключается в том, что если приемником является каталог на том же диске, то вам требуется дополнительное место на диске для размещения второго образа. Вам также необходимо иметь достаточно описателей файлов (inodes) для сохранения всех файлов. В противном случае вы можете лишиться шанса сбросить в "мусорную корзину" ваши рабочие файлы.
В командной строке допустимо указание каталога-источника и имя каталога-приемника. Единственный ключ, допустимый в командной строке это "-s". Любой другой ключ приводит к завершению команды, не вызывая никаких разрушений. Вы, конечно, можете добавить программный код с целью проверки опции и выдачи сообщения о допустимых ключах, если указано нечто отличное от -s. Если вы делаете еще какую-либо проверку на наличие ошибок сверх того, что требуется для предотвращения разрушения данных или системы, то это дело личного вкуса. Минимизация проверок на наличие ошибок дает более компактные и быстрые сценарии, подходящие для опытных пользователей.
Если указанный каталог-приемник не существует, то он создается. Если каталог-приемник уже существует, выдается сообщение об этом и вам задается вопрос о том, хотите ли вы очистить его. Если вы ответите "yes", каталог уничтожается и создается снова пустым. Если вы ответите "no", каталог остается таким, какой есть и копируемые файлы просто добавляются к уже существующим в наличии. При этом может возникнуть некоторая путаница, особенно если некоторые файлы с такими именами уже существуют в каталоге-приемнике. В большинстве случаев, однако, у пользователей не появляется желания добавлять свою копию в существующий каталог.
Тем не менее каталог-приемник должен быть создан, поскольку необходимо его наличие, чтобы команда cpio работала правильно. Если же его нет, cpio не выполнится и выдаст сообщение об ошибке.
Процедура cptdir начинает копирование путем прохождения по каталогу-источнику и формирования списка файлов, находящихся в нем, рекурсивно обходя дерево сверху вниз. В результате может получиться, что скопируется больше, чем вы планировали, поэтому вам необходимо знать размер файловой структуры, которую вы хотите скопировать. Затем файлы копируются в каталог-приемник. Исходные файлы никак не модифицируются и не изменяются (за исключением того, что дата последнего доступа может быть модифицирована).
Когда идет копирование, на экран выдается сообщение от cpio, которое показывает полный маршрут к файлам-приемникам. Этот маршрут должен соответствовать маршруту, указанному в командной строке, в противном случае что-то не так.
1. $ cd /mnt $ cptdir /bin .
Перейти на другой диск (обычно смонтированный в каталоге /mnt) и копировать все файлы из каталога /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.
Имя: can
can Управление "мусорной корзиной" файлов
Перемещает файлы в "мусорную корзину", симулируя их удаление. Это допускает восстановление файлов после их кажущегося удаления.
can [-l] [-r] file [file ...]
can junk Посылает файл junk в "мусорную корзину"
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 ...]" gt;&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, передаются ей. Таким способом мы можем изменить путь, которым файлы посылаются в "мусорную корзину".
Назад | Содержание | Вперед