Главная » Программирование для UNIX » Вывод программы в качестве аргументов UNIX

0

Теперь перейдем от аргументов команды внутри командного файла к формированию  аргументов. Конечно же,  самый  распространенный способ  порождения аргументов состоит в расширении имени файла с помощью метасимволов типа  * (не считая явного ввода аргументов), но есть и другой хороший способ – запуск программы. Вывод любой  программы может быть  помещен в командную строку, для  этого команда должна быть заключена в обратные кавычки `…`:

$ 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 и  предъявив ее оболочке (не очень красивый способ),  но гораздо проще сказать:

$ mail  `cat mailinglist` <letter

Выполняется cat, создавая список имен пользователей, которые и становятся аргументами mail. (Интерпретируя вывод, заключенный в обратные кавычки, как аргументы, оболочка воспринимает разделители строк как разделители слов, а не как символы завершения командной строки; эта тема  будет подробно обсуждаться в главе 5.) Обратные кавычки достаточно просты и удобны  в использовании, так  что команда mail не нуждается в специальном параметре для списка рассылки.

Несколько  другой подход   заключается  в  преобразовании файла ma– ilinglist из  собственно списка имен  в  программу, которая  выводит список имен.

$ cat  mailinglist             Новая версия

echo don whr  ejs mb

$ cx  mailinglist

$ mailinglist

don whr ejs mb

$

Теперь рассылка  писем  пользователям  по  списку выглядит  следующим  образом:

$ mail  `mailinglist`  <letter

Если   добавить еще  одну  команду, появится  возможность изменять список пользователей в интерактивном режиме. Такая программа называется pick:

$ pick  аргументы

Аргументы предъявляются один за другим, и после каждого программа  ожидает ответа. Выводом pick  являются те аргументы, в ответ на которые поступило y (yes);  любой другой ответ означает, что аргумент будет отброшен. Например,

$ pr  `pick *.c` | lpr

выводит одно за другим все имена файлов, оканчивающиеся на .c; те из них, которые будут выбраны (ответ  «y»), печатаются программами pr и lpr. (Команда pick не входит в седьмую версию, но она настолько проста и удобна, что ее версии были  включены в примеры глав  5 и 6.)

Предположим, что речь идет о второй версии mailinglist. Тогда посылка писем  адресатам don и mb выглядит так:

$ mail  `pick \`mailinglist\“  <letter

don? y whr? ejs? mb?  y

$

Обратите внимание на  то, что  в записи присутствуют вложенные обратные кавычки;  наличие обратной косой  черты предотвращает  интерпретацию внутренних `…` при разборе внешних.

Упражнение 3.10. Что произойдет, если в

$ echo `echo  \`date\“

убрать все символы обратной косой  черты? ~

Упражнение 3.11. Введите

$ `date`

и поясните результат. ~

Упражнение 3.12.

$ grep  -l шаблон имена5файлов

перечисляет имена файлов, которые соответствуют шаблону, но больше ничего не выводит. Попробуйте запустить несколько вариаций на тему

$ команда `grep  -l шаблон имена5файлов`

~

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии