dial-a-joke 212-976-3838
dial-a-prayer 212-246-4200
dial santa 212-976-3636
dow jones report 212-976-4141
то для поиска в нем можно воспользоваться командой grep
. (Ваш собственный каталог lib
— хорошее хранилище таких частных баз данных.) Поскольку команда grep
не определяет формат информации, можно искать имена, адреса, индексы или еще какие-нибудь нужные вам сведения. Составим справочную программу для каталога, которой дадим имя 411
по номеру одной из телефонных справочных служб:
$ echo 'grep $* /usr/you/lib/phone-book' > 411
$ cx 411
$ 411 joke
dial-a-joke 212-976-3838
$ 411 dial
dial-a-joke 212-976-3838
dial-a-prayer 212-246-4200
dial santa 212-976-3636
$ 411 'dow jones'
grep: can't open jones
Что-то не так
$
Последний пример вскрывает потенциальную проблему: хотя dow jones
представляет для команды 411
единый аргумент, он содержит пробел и уже не заключен в апострофы, поэтому порожденный интерпретатор, выполняющий команду 411
, преобразует его в два аргумента для grep
, как если бы вы задали
$ grep dow jones /usr/you/lib/phone-book
что, очевидно, неверно.
Один из возможных путей обойти эту проблему основан на том, как интерпретатор трактует кавычки. Хотя все, что заключено в '...'
, не затрагивается, интерпретатор "заглядывает" внутрь "..."
в поиске комбинаций с $
, \
, `...`
. Поэтому если изменить команду 411 следующим образом:
$ grep "$*" /usr/you/lib/phone-book
то $*
заменяется на аргументы, но команде grep
передается как один аргумент, даже при наличии пробелов:
$ 411 dow jones
dow jones report 212-976-4141
$
Кстати, можно сделать с помощью флага -y
команду grep
(а значит, и 411
) независимой от использования строчных или прописных букв:
$ grep -y pattern ...
При наличии флага -y
строчные буквы из шаблона могут сопоставляться с прописными буквами из входного потока. (Такой флаг есть в седьмой версии, но отсутствует в других системах.)
Более подробно аргументы команд мы рассмотрим в гл. 5, но одно важное замечание необходимо сделать здесь. Аргумент $0
— это имя выполняемой программы; в случае cx $0
есть "cx"
. Новое применение $0
находит в реализации программ 2
, 3
, 4
, …, которые печатают свой выходной поток в несколько столбцов:
$ who | 2
drh tty0 Sep 28 21:23 cvw tty5 Sep 28 21:09
dmr tty6 Sep 28 21:10 scj tty7 Sep 28 22:11
you tty9 Sep 28 23:00 jib ttyb Sep 28 19:58
$
Реализация команд 2
, 3
, … идентична. По существу, они являются связями с одним файлом:
$ ln 2 3; ln 2 4; ln 2 5; ln 2 6
$ ls -l [1-9]
167222 -rwxrwxrwx 5 you 51 Sep 28 23:21 2
167222 -rwxrwxrwx 5 you 51 Sep 28 23:21 3
167222 -rwxrwxrwx 5 you 51 Sep 28 23:21 4
167222 -rwxrwxrwx 5 you 51 Sep 28 23:21 5
167222 -rwxrwxrwx 5 you 51 Sep 28 23:21 6
$ ls /usr/you/bin | 5
2 3 4 411 5
6 cx lc m nu
what where
$ cat 5
# 2, 3, ...: печать в n столбцов
pr -$0 -t -11 $*
$
Флаг -t
убирает заголовки в начале страницы, а флаг -ln
устанавливает размер страницы равным n
строк. Имя программы становится числом столбцов, т.е. аргументов для команды pr, так что выходной поток печатается строками по несколько столбцов, число которых определено аргументом $0
.
3.5 Результат выполнения программы в качестве аргумента
Теперь перейдем от аргументов команд для командного файла к порождению аргументов. Конечно, расширение имен файлов с помощью метасимволов, подобных *
, является наиболее типичным способом порождения аргументов (иным, чем их явное задание), но столь же хорошим способом представляется и выполнение программы. Результат выполнения любой программы можно использовать в командной строке, заключив ее вызов в символы слабого ударения `...`
:
$ echo At the tone the time will be `date`.
At the tone the time will be Thu Sep 29 00:02:15 EDT 1983.
$
Небольшое изменение показывает, что `...`
интерпретируется и внутри кавычек "..."
:
$ echo "At the tone
> the time will be `date`."
At the tone
the time will be Thu Sep 29 00:03:07 EDT 1983.
$
В качестве другого примера предположим, что вам необходимо послать почту группе людей, которые зарегистрированы под именем, хранящимся в файле mailinglist
. Можно, конечно, отредактировать файл mailinglist
так, чтобы он стал пригодным для применения команды mail
и передать его интерпретатору, но значительно проще использовать команду
Читать дальше
Конец ознакомительного отрывка
Купить книгу