Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Сэйдж Рас Весь текст 822.4 Kb

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

Предыдущая страница Следующая страница
1 ... 3 4 5 6 7 8 9  10 11 12 13 14 15 16 ... 71

     Поиск всех вызовов ioctl в исходных Си-файлах, начиная с каталога
/usr/src.  (Обратите внимание,  что я являюсь суперпользователем.  Это
видно из того, что я занимаюсь поиском в ограниченной части системы, а
именно в исходных дистрибутивах,  а также из того, что в качестве сим-
вола приглашения используется символ "#".)

4.  $ tgrep "| more" `find . -type f -print`

     Поиск символа вертикальной черты (|), после которого следует сло-
во more,  в списке имен файлов, генерируемом оператором find. Find пе-
чатает имена всех файлов текущего каталога и всех подкаталогов,  кото-
рые являются обычными файлами.

5.  $ tgrep trap /bin /usr/bin /etc

     Поиск команды  прерывания (trap) во всех командных файлах интерп-
ретатора shell, которые имеются в трех каталогах.

     ПОЯСНЕНИЯ

     В строке 4 переменная OPT,  в которой хранятся необязательные ко-
манды оператора find, инициализируется в нулевое значение.
     Строки 6-18 выполняют проверку на  наличие  ошибок.  Проверяется,
является ли первым символом каждого позиционного параметра символ "-".
Если проверка успешна,  то проверяется на корректность  сам  аргумент.
Возможными опциями являются -c и -h. Если указано что-либо другое, вы-
водится сообщение об ошибке и программа завершается.  Обратите  внима-
ние, что с помощью команды shift допустимые опции удаляются из команд-
ной строки. Это сделано для того, чтобы впоследствии выражение $@ мог-
ло  быть  использовано для получения только аргументов строки поиска и
маршрута. Выражение $@ является другой формой выражения $ *, в которой
оно распространяется на все позиционные параметры.  Однако в последую-
щем тексте мы увидим одно большое отличие между ними.
     Еще один  трюк  сделан  при  присвоении значения переменной OPT в
строке 10.  Этой переменной нам необходимо присвоить значение, которое
включает  в  себя  пару кавычек,  поскольку кавычки должны быть частью
строки поиска,  которая в конце концов используется  оператором  find.
Однако обнаружение второй кавычки обычно ЗАВЕРШАЕТ оператор присваива-
ния, а мы этого в данном случае не хотим. Выходом из ситуации является
использование символа \, который отменяет специальное значение следую-
щего за ним символа. В данном случае специальное значение было бы кон-
цом строки присваивания.
     Таким образом,  кавычка перед звездочкой (*) в строке 10 рассмат-
ривается как часть значения переменной OPT,  вместо того, чтобы завер-
шать операцию присваивания. Следующая встреченная кавычка также должна
быть  сохранена  в  значении переменной,  чтобы указать конец хранимой
здесь строки  поиска,  поэтому  она  также  экранирована  символом  \.
Последняя кавычка в этой строке не экранирована обратной косой чертой.
Эта кавычка соответствует своей обычной функции в смысле интерпретато-
ра shell и завершает оператор присваивания.
     Вам нужно поэкспериментировать с  использованием  кавычек,  чтобы
понять его.  Когда какой-то командный файл не желает работать правиль-
но, но ошибок не видно, проверьте правильность использования кавычек.
     Оставшаяся часть  командного  файла  -  это оператор case (строки
21-37),  который имеет дело с числом аргументов командной строки. Если
нет никаких аргументов, печатается сообщение об ошибке и мы выходим из
программы. Мы ведь не можем делать никакого поиска командой grep, если
мы даже не знаем, какую строку нужно искать.
     Если указан только один аргумент,  то это должна быть строка  по-
иска. Это также означает, что в командной строке не указаны имена фай-
лов и поэтому мы читаем их со стандартного устройства ввода,  т.е. ко-
мандный файл действует как фильтр. Цикл while (строки 26-29) читает со
стандартного ввода имя каждого файла для поиска в  нем  командой  grep
нужной строки. Опция -y команды grep означает нечувствительность к ре-
гистру символов при поиске.  Использование этой опции дает нам хорошие
шансы попасть на нужную строку.
     Другой интересной особенностью этого цикла являются  две  команды
grep  в строках 28 и 34.  Мы ищем нужную строку не только в файле,  но
также в каталоге /dev/null.  Это кажется странным? Да. Проблема заклю-
чается в самой команде grep. Grep знает, когда в командной строке ука-
зано более одного файла. Если имеется более одного файла, то имя файла
выводится  на  экран  до вывода найденной строки.  Если же в командной
строке указан только один файл,  то его имя  не  выводится,  поскольку
считается,  что пользователь должен помнить это имя. Это создает проб-
лемы при написании командных файлов,  когда вы имеете много имен  фай-
лов, но они обрабатываются по одному. Мы обрабатываем файлы по одному,
поскольку если бы мы использовали указание группового имени  файлов  с
помощью метасимволов,  то могло бы оказаться слишком много имен файлов
в одной командной строке для команды grep.  Поэтому вместо использова-
ния некоторой замысловатой схемы для сокращения количества аргументов,
мы избегаем этого путем обработки в цикле каждого  файла  по  очереди.
Поскольку на самом деле мы ищем большое количество разных строк, то мы
хотим видеть имена файлов, в которых они были найдены.
     При указании  в  командной  строке grep каталога /dev/null,  grep
всегда печатает имя файла до вывода найденной строки  в  нашем  цикле,
поскольку теперь имеется два имени файла в качестве аргументов. Конеч-
но, в /dev/null ничего нельзя найти, поскольку он пуст по определению.
     Последний образец  в операторе case (строки 31-36) - это ловушка.
Он соответствует любому количеству позиционных параметров сверх  одно-
го,  что  позволяет  нам  иметь переменное число каталогов в командной
строке.
     Даже хотя  мы можем указать несколько каталогов в командной стро-
ке, первым аргументом по-прежнему является строка поиска. Не так легко
сказать:  "начиная со второго параметра",  поэтому мы сохраняем строку
поиска (в переменной STRING - Прим.  перев.)  и  убираем  ее  командой
shift.  Теперь  мы  можем  получить доступ к остальной части командной
строки с помощью выражения $@.
     Давайте посмотрим, что происходит, когда мы ссылаемся на перемен-
ную $OPT для получения опций команды find.  Допустим, мы вызвали tgrep
с опцией -c.  Когда мы присваиваем значение переменной OPT,  мы ставим
строку c в виде "*.c" внутри двойных кавычек,  поскольку мы не желаем,
чтобы  shell  раскрывал  эту строку (т.е.  трактовал ее как имена всех
файлов,  соответствующих данному образцу) именно сейчас.  Теперь,  как
только к переменной $OPT есть обращение в команде find,  значением OPT
является *.c,  что означает поиск  файлов,  символьные  имена  которых
соответствуют  *.c.  Для  отмены  символьной  интерпретации  мы должны
использовать команду eval. Перед выполнением команды find команда eval
заставляет  shell повторно анализировать команду в отношении распрост-
ранения значения переменной. На этом проходе выражение "*.c" превраща-
ется в *.c,  что разрешает генерацию имен файлов таким образом,  чтобы
были просмотрены все эти файлы.
     Указывая $@  в  команде find,  мы можем производить поиск во всех
каталогах сразу.  Таким образом,  нам нужно вызвать find  только  один
раз, что позволяет сберечь время центрального процессора. Одной из ин-
тересных проблем,  возникших при разработке данного  командного  файла
было то,  что выражение вида $* не работало.  В команде find возникала
ошибка сохранения. Даже запуск shell'а в режиме -x (установленный флаг
разрешения выполнения) не разрешил проблему. Изменение синтаксиса, ка-
жется,  помогло разобраться с ней. Оказывается, причина в том, что вы-
ражение  $*  раскрывается  в "$1 $2 ...",  в то время как выражение $@
превращается в "$1" "$2" (т.е. в отдельные аргументы). Происходило то,
что  выражение  $*  передавало имена нескольких каталогов команде find
как одну строку.  Команда find не могла обнаружить файл  такого  типа,
поэтому прекращала выполнение. Когда же вместо этого было использовано
выражение $@, команда find получила несколько независимых строк с име-
нами.  Это вполне подошло команде find, и все заработало. Такие мелкие
детали всегда требуют много времени для изучения!

     ВОЗМОЖНЫЕ ИССЛЕДОВАНИЯ

     В чем разница между двумя следующими операторами?

grep "$1" `find "$2" -print`

и

find "$2" -print | while read F
do
        grep "$1" $F
done

     Они кажутся  совершенно похожими,  но существует различие в глав-
ном.  Первый оператор - это один вызов команды grep. Аргументами явля-
ются множество имен файлов, поставляемых командой find. Если find сге-
нерирует слишком много имен файлов,  то выполнение команды завершится.
О том,  что сгенерировано слишком много имен файлов,  никакого предуп-
реждения не выдается,  но большое количество файлов фатально для grep.
Поэтому мы должны рассматривать такой синтаксис как недопустимый в об-
щем случае.
     Второй оператор - это цикл. Он работает медленнее и вызывает grep
много раз,  что забирает много времени центрального процессора. Однако
положительным моментом является то, что цикл получает данные по конве-
йеру, который фактически не имеет ограничений на число данных, которое
он может иметь.  Наша программа никогда неожиданно не прекратит выпол-
нение.

  2.1.4. paths  -  нахождение пути доступа к исполняемым файлам,  со
                   специальными опциями

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

ИМЯ:  paths
---------------------------------------------------------------------------

paths   Определитель маршрутных имен файлов со специальными
        опциями

     НАЗНАЧЕНИЕ

     Выводит на экран каталог,  в котором располагается  файл,  выдает
имя файла в длинном формате или ищет файлы с установленным битом поль-
зовательского идентификатора (setuid bit files) в каталогах по указан-
ному маршруту.

     ФОРМАТ ВЫЗОВА

     paths [-l] [-s] file [file ...]

     ПРИМЕР ВЫЗОВА

     $ paths -l ed ex vi

     Выдает в длинном формате имена файлов, которые являются исполняе-
мыми модулями редакторов ed, ex и vi

     ТЕКСТ ПРОГРАММЫ

1   :
2   # @(#) paths v1.0 Path locator with special options Author: Russ Sage
2а    Определитель местонахождения файлов со специальными опциями

4   FORMAT="path"

6   for ARG in $@
7   do
8           if [ '`echo $ARG | cut -c1`" = "-" ]
9             then case $ARG in
10                 -l)  FORMAT="ls"
11                      shift;;
12                 -s)  FORMAT="set"
13                      set "1";;
14                 *)   echo $0: arg error"                        >&2
15                      echo "usage: $0 [-l] [-s] file [file ...]" >&2
16                      exit 1;;
17                 esac
18          fi
19  done

21  IFS="${IFS}:"

23  for FILE in $@
24  do
25           for DIR in $PATH
26           do
27                   case $FORMAT in
28                   path)  if [ -f $DIR/$FILE ]
29                             then echo $DIR/$FILE
30                          fi;;
31                   ls)    if [ -f $DIR/$FILE ]
32                            then ls -l $DIR/$FILE
33                          fi;;
34                   set)   echo "\n:::::::::::::::::::"
35                          echo "$DIR"
36                          echo "::::::::::::::::::::"
37                          ls -al $DIR | grep "^[^ ]*s[^ ]*";;
38                   esac
39            done
40  done

     ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ

ARG       Содержит каждый аргумент командной строки
DIR       Элемент с именем каталога в переменной PATH
FILE      Содержит имя каждого файла в командной строке
FORMAT    Тип требуемого формата выходных данных
IFS       Переменная shell'а, разделитель полей
PATH      Переменная shell'а, пути к каталогам исполняемых
          модулей

       ОПИСАНИЕ

                ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ paths?

      В нашей среде интерпретатора shell переменная с именем PATH со-
Предыдущая страница Следующая страница
1 ... 3 4 5 6 7 8 9  10 11 12 13 14 15 16 ... 71
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (52)

Реклама