Приемы профессиональной работы в UNIX

         

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


В нынешней реализации никакие дополнительные ключи не допускается передача никаких дополнительных ключей команде 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.


Одно из мест, где вы можете настраивать dosflp, это регулярные выражения. Уже включены выражения для .asm, .c и .h, но вы можете изменить это или добавить больше ключей для любой последовательности, которую вы часто используете.




Неплохой модификацией может быть вариант, чтобы dsum печатала не только значения, как это сделано, но и флаг в конце строки в случае, когда два файла отличаются. Тогда у нас не было бы необходимости просматривать непосредственно числа. Мы ищем флаг и сразу видим, когда что-то не так.

Ниже приводится решение проблемы вывода флага для того, чтобы облегчить вам работу. Оно не включено в представленную выше утилиту по той причине, что такого рода вещи могут быть выполнены относительно просто. Вы можете сами сделать эту модификацию в качестве упражнения. Текст программы, выполняющей эту работу, выглядит так:

for FILE in $1/$FLIST do BASEF=`basename $FILE` S1=`sum $FILE 2>&1 | cut -d' ' -f1` S2=`sum $2/$BASEF 2>&1 | cut -d' ' -f1` if [ "$S1" = "$S2" ] then M="" else M="<---" fi if [ ` expr $BASEF : '.*'` -lt 7 ] then echo "$BASEF: \t$S1\t$S2 $M" else echo "$BASEF:\t$S1\t$S2 $M" fi done

Подход к решению немного отличается от решения, принятого при написании dsum, поскольку вы не можете генерировать контрольную сумму на ходу. Вы должны перехватить выход команды sum и использовать его позже. То, что мы ищем, появляется в шестой строке. Если две контрольные суммы различны, переменная M устанавливается соответствующим образом. Если файлы различаются, переменная M получает стрелку, указывающую на то, что копия плохая.



Содержание раздела