"Рас Сэйдж. Приемы профессиональной работы в UNIX" - читать интересную книгу автораДля каждого файла, который является текстовым, печатается строка двое-
точий (:) до и после имени файла, а команда head системы UNIX печатает первые 15 строк. Такой сценарий продолжается, пока не закончатся дан- ные в стандартном вводе. Рассмотрим другую альтернативу, покрываемую данным оператором вы- бора. Она обрабатывает ситуацию, когда имеется несколько позиционных параметров (что указано символом * в операторе case). Цикл for пробе- гает все параметры (строка 20). Звездочка (*) в операторе case означа- ет, что подходит любое значение, которое не подошло ранее. Это улавли- вающая (catchall) опция. Цикл for использует аргумент $* в качестве своего входа. Он представляет значения всех позиционных параметров, что является фактически всей командной строкой, исключая имя утилиты. Команда find используется для поиска всех нормальных файлов в ка- талоге. "Нормальные" файлы не означает "только текстовые файлы", поэ- тому мы проверим это позже. Выход команды find передается по каналу команде sort, чтобы сделать его более наглядным. Отсортированный список передается по каналу в цикл while, который помещает имя файла в переменную FILE (строка 27). Проверяется, текстовый ли файл, затем он печатается командой head. Если мы сравним строки 13-18 и строки 24-29, то мы увидим, что это один и тот же код. В большинстве языков программирования это озна- чало бы, что мы должны оформить эти строки как процедуру и вызывать ее, когда нужно. Язык программирования интерпретатора shell, хотя и довольно мощный, не имеет хорошего способа реализации процедур. Последний интерпретатор shell в System V имеет функции, которые позво- Отметим, что внутренний цикл while повторяется на каждом файле, который существует в определенном каталоге, а внешний цикл for прохо- дит от каталога к каталогу. ВОЗМОЖНЫЕ МОДИФИКАЦИИ Для увеличения гибкости хорошо бы добавить опции, чтобы вы могли переходить на команду find непосредственно из thead. Полезными аргу- ментами были бы -name для изолирования образцов имен файлов и -ctime для обработки изменений, связанных со временем. Еще одной привлекательной особенностью было бы добавление опции грамматического разбора (основанной на -) и опции -n, указывающей, что из команды head должно быть напечатано n строк. ВОЗМОЖНЫЕ ИССЛЕДОВАНИЯ В чем отличие между двумя следующими операторами? $ find $HOME -name "*.c" -print | thead и $ find $HOME -name "*.c" -exec head {} \; |
|
|