Команда bundle: складемо всі разом

Для того щоб усвідомити особливості створення командних файлів, давайте напишемо велику програму Припустимо, що отримано лист від колеги, який працює на іншому компютері (наприклад, so-mewhere Bob1) він хотів би скопіювати командні файли з вашого ка талоге / bin Найпростіший спосіб – це послати їх йому у відповіді на його лист Для початку введіть:

$ cd /usr/you/bin

$ for  i in  `pick *`

&gt do

&gt           echo ============  This  is file $i  ============

&gt           cat  $i

&gt done | mail  somewherebob

$

Але давайте встанемо на місце somewhere Bob: він отримає лист, що містить всі файли вони, звичайно, будуть розділені, але буде потрібно редактор, щоб виділити кожен компонент у файл Внутрішній голос підказує, що правильно побудоване поштове повідомлення могло б автоматично та так що одержувачу при-

1 Існують різні позначення для запису адрес віддалених машин Найпоширеніше з них – це компютеркористувач (Див mail (1))

йшлося б нічого робити вручну Це передбачає створення командного файлу, що містить як файли, так і інструкції по розпакуванні

Інтуїція підказує і друге міркування – зручним способом комбінування виклику команди і даних для цієї команди є вбудований документ Тепер залишилося тільки правильно розставити лапки Вийшла працююча програма bundle, яка згруповують файли в автономний командний файл на своєму стандартному виводі:

$ cat  bundle

# Bundle: згрупувати файли в дистрибутивний пакет

echo # Щоб розпакувати, запустіть цей файл for i

do

done

$

echo &quotecho  $i  1&gt&amp2&quot

echo  &quotcat  &gt$i  &lt&lt’End  of  $i&quot cat  $i

echo &quotEnd of  $i&quot

Висновок в лапки End of $ i гарантує, що всі метасимволи оболонки в файлах будуть проігноровані

Звичайно ж, варто випробувати програму, перш ніж використовувати її для відправлення файлів somewhere Bob:

$ bundle cx lc> junk Створити пробну команду bundle

$ cat  junk

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

cat  &gtcx &lt&lt’End of  cx

chmod  +x $* End of  cx echo lc 1&gt&amp2

cat  &gtlc  &lt&lt’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 є однією з найкрасивіших програм оболонки – всього кілька рядків коду, які реалізують просте і елегантне рішення важливого завдання

Вправа 317Як використовувати bundle для відправлення всіх файлів каталогу і його підкаталогів Підказка: командні файли можуть бути рекурсивними ~

Вправа 318Змініть bundle так, щоб разом з кожним фай лом відправлялася і інформація, отримана від ls-l, зокрема права доступу і дата останньої зміни Порівняйте можливості bundle з можливостями програми стиснення даних ar (1) ~

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*