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


ПОЯСНЕНИЯ


В строках 4-9 производится проверка на наличие ошибок. Если указано менее двух аргументов, значит управляющий каталог и/или каталог копии не указан и в результате обнаруживается ошибка. Если количество аргументов превышает три, значит, указано еще что-то кроме ключа -c и двух каталогов, что также является ошибкой. Все остальное (два или три аргумента) рассматривается как допустимое значение.

В строках 11-21 производится инициализация переменной FLIST. FLIST - это управляющая переменная, которая определяет имена файлов, на которые надо обратить внимание. Если в командной строке указаны только имена каталогов ($# = 2), FLIST присваивается значение по умолчанию * (все файлы) в строке 12. Значение * присваивается переменой FLIST и не трактуется в это время как метасимвол (это особенность командного процессора). Если в командной строке указан ключ ($# = 3), производится проверка первой переменной и FLIST получает соответствующее значение, *.c или *.o. Если указана не такая опция, выводится сообщение об ошибке и программа завершается.

В строках 23-31 выполняется сама работа. Здесь выполняется цикл for, который проходит по списку слов, созданному управляющим каталогом в соответствии со значением переменной FLIST. В строке 23 переменная FLIST расширяется фактически с символа * в имя каждого файла. Тем самым цикл for получает данные для использования. Следовательно, переменная FLIST является полным маршрутным именем каждого файла в управляющем каталоге.

Строка 25 разбирает расширение, сделанное в строке 19. Переменная BASEF получает базовое имя полного маршрута из переменной FILE. Причиной, по которой мы это делаем, является тот факт, что позже при ссылке на каталог копии нам необходимо только имя файла. (В системе UNIX команда basename возвращает последний элемент в указанном маршруте, т.е. само имя файла, если маршрут содержит промежуточные каталоги.)

Строки 26-29 выводят первую часть выходного сообщения. Оператор if-then использован потому, что нам нужно менять выходное сообщение в зависимости от того, сколько символов содержит имя файла. Строка 26 определяет длину имени файла, используя команду expr. Команда expr может быть использована для сравнения двух строк и получает количество совпавших символов. Сравнение имени файла со "всеми символами" (*), таким образом возвращает длину строки. (У вас может возникнуть желание обратиться к expr(1), чтобы получить информацию о других хитростях этой многоцелевой команды.)

Это возвращаемое значение используется в операторе test для определения, содержит ли имя файла менее семи символов: возможно всего один или два символа. В последнем случае, если мы делаем табуляцию, мы получим только первую позицию табуляции. Для получения последующих табуляций мы отображаем семь символов для того, чтобы попасть на место следующего поля табуляции. (Если было 3-6 символов, мы все равно остановимся на поле второй табуляции, т.е. это место работает верно.) Затем отображаем табуляцию для того, чтобы мы попали на место окончания второй табуляции, что нам и требовалось.

Если имя файла содержит более семи символов, мы уже находимся в первой позиции табуляции или за ней. Таким образом, следующий символ табуляции передвинет нас во вторую позицию табуляции. Эффект заключается в том, что для размещения колонок не имеет значения размер имени файла (кроме случая, когда оно действительно очень длинное). Это позволяет избавиться от "блюза ползущих колонок", когда колонки сдвигаются в зависимости от размера отображаемой информации. В качестве примера такого эффекта может служить стандартная команда sum. Ее выход выглядит так:




Начало  Назад  Вперед