Главная » Программирование для UNIX » Команда bundle: сложим все вместе

0

Для того чтобы осознать особенности создания командных файлов, давайте  напишем  большую  программу.  Предположим,  что  получено письмо от коллеги, работающего на другом компьютере (например, so– mewhere!bob1); он хотел бы скопировать командные файлы из вашего ка талога /bin. Самый простой способ – это послать их ему в ответе  на его письмо. Для начала введите:

$ cd /usr/you/bin

$ for  i in  `pick *`

> do

>           echo ============  This  is file $i  ============

>           cat  $i

> done | mail  somewhere!bob

$

Но давайте встанем на место  somewhere!bob: он получит письмо, содержащее все файлы; они, конечно, будут  разделены, но потребуется редактор, чтобы выделить каждый компонент в файл. Внутренний голос подсказывает, что правильно построенное почтовое сообщение могло  бы автоматически самораспаковываться, так что получателю не при-

1        Существуют различные  обозначения для  записи  адресов удаленных  машин. Самое распространенное из  них  – это компьютер!пользователь (см. mail(1)).

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

Интуиция  подсказывает и  второе   соображение –  удобным способом  комбинирования вызова команды и данных для  этой команды является  встроенный документ. Теперь  осталось только  правильно расставить   кавычки. Получилась  работающая программа bundle,  которая сгруппировывает файлы  в  автономный  командный  файл  на  своем стандартном выводе:

$ cat  bundle

# bundle: сгруппировать файлы  в дистрибутивный  пакет

echo ‘# Чтобы  распаковать,  запустите  этот  файл’ for  i

do

done

$

echo "echo  $i  1>&2"

echo  "cat  >$i  <<‘End  of  $i’" cat  $i

echo "End of  $i"

Заключение в кавычки "End of  $i" гарантирует, что все метасимволы оболочки в файлах будут проигнорированы.

Конечно же, стоит опробовать программу, прежде чем использовать ее для отправки файлов somewhere!bob:

$ bundle  cx  lc >junk                                   Создать пробную команду bundle

$ cat  junk

# Чтобы  распаковать,  запустите  этот  файл echo cx  1>&2

cat  >cx <<‘End of  cx’

chmod  +x $* End of  cx echo lc 1>&2

cat  >lc  <<‘End of  lc’

# lc: сосчитать  количество строк  в файлах  wc –l  $*

End of  lc

$ mkdir  test

$ cd test

$ sh  ../junk                                                   Проверим ее

cx lc

$ ls

cx lc

$ cat  cx

chmod  +x $*

$ cat  lc

# lc: сосчитать  количество строк в файлах

wc  –l  $*                                                              Похоже, все нормально

$ cd ..

$ rm junk  test/*;  rmdir  test                  Очистить

$ pwd

/usr/you/bin

$ bundle  `pick *`  | mail  somewhere!bob      Отправить файлы

Наличие в одном из отправляемых файлов строки

End of  имя5файла

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

Программа bundle  представляет собой  яркую  иллюстрацию гибкости среды UNIX: она использует циклы оболочки, перенаправление ввода вывода, встроенные документы и командные файлы, непосредственно взаимодействует с mail. Но, наверное, самое интересное заключается в том,  что bundle – это программа, которая создает программу. По мнению авторов, bundle является одной из самых красивых программ оболочки – всего несколько строк кода, которые реализуют простое и элегантное решение важной задачи.

Упражнение 3.17.  Как  использовать bundle для отправки всех  файлов каталога  и  его  подкаталогов? Подсказка:  командные файлы  могут  быть рекурсивными. ~

Упражнение 3.18.  Измените bundle так, чтобы вместе  с каждым фай лом  отправлялась и  информация, полученная от  ls –l,  в  частности права доступа и  дата  последнего изменения.  Сравните возможности bundle с возможностями программы сжатия данных ar(1). ~

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

По теме:

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