Робота з оболонкою Структура командного рядка

Самою важливою програмою для більшості користувачів UNIX є оболонка – програма, яка інтерпретує запити на виконання команд взаємодія з нею займає більше часу, ніж зі усіма іншими програмами, може бути, за винятком улюбленого текстового редактора У цьому розділі і в розділі 5 представлений великий обсяг інформації, що стосується можливостей оболонки Це зроблено для того, щоб показати, що дуже багато завдань можна вирішити, не докладаючи титанічних зусиль і, звичайно ж, не вдаючись до програмування на традиційних мовах типу Сі

Ми розділили розповідь про оболонці на дві глави Дана глава описує більш складні, ніж описані у розділі 1, але також широко використовувані властивості оболонки: застосування метасимволов, увязнення в лапки, створення нових команд, передача їм аргументів, роботу з змінними оболонки і елементарні управляючі конструкції Це те, що слід знати для того, щоб самостійно використовувати оболонку Матеріал же, представлений в розділі 5, дещо складніше – він призначений для написання серйозних програм оболонки, «куленепробивних» для інших користувачів Інформація поділена між главами в деякій мірі випадковим чином, так що в кінцевому рахунку треба прочитати обидві

Почнемо з того, що спробуємо зрозуміти, що таке команда і як вона інтерпретується оболонкою У цьому розділі не дуже багато нової інформації, основна частина присвячена формалізації базових відомостей, представлених у розділі 1

Найпростіша команда складається з одного слова, Зазвичай цим словом є імя файлу, який повинен бути виконаний (пізніше будуть розглянуті і інші види програм):

$ who Виконати файл /bin/who you           tty2        Sep 28  07:51

jpl        tty4        Sep 28 08:32

$

Зазвичай команда закінчується символом роздільника рядків, але часто для завершення команди застосовується і крапка з комою:

$ date

Wed  Sep 28 09:07:15  EDT  1983

$ date  who

Wed  Sep 28 09:07:23  EDT  1983

you

tty2

Sep 28 07:51

jpl

tty4

Sep 28 08:32

$

Незважаючи на те що для завершення команди можна використовувати крапку з комою, зазвичай нічого не відбувається до тих пір, поки не натиснута клавіша Return Зверніть увагу на те, що після кількох команд, введених в одному рядку, оболонка виводить тільки одне запрошення на введення, але в іншому (не рахуючи кількості запрошень) введення

$ date  who

ідентичний введенню двох команд в різних рядках Зокрема, who не виконується до тих пір, поки не завершиться date

Спробуємо передати висновок «date who »в канал:

$ date  who | wc

Wed  Sep 28 09:08:48  EDT  1983

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 10         60

$

Ймовірно, це не зовсім те, чого ви очікували Справа в тому, що тільки висновок who передається wc Зєднання команд who і wc допомогою каналу утворює єдину команду, яка називаєтьсяконвеєром (pipeline), Вона-то і виконується після завершення date При розборі командного рядка оболонка враховує те, що пріоритет | вище, ніж пріоритет.

Можна згрупувати команди за допомогою дужок:

$ (date who)

Wed  Sep  28  09:11:09  EDT  1983 you           tty2        Sep  28  07:51 jpl           tty4        Sep  28  08:32

$ (date who)  | wc

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 16         89

$

Результат виконання команд date і who конкатенуються в один потік, який може бути направлений в канал

Потік даних по каналу може бути перехоплений і поміщений у файл (але не в інший канал) за допомогою команди tee, яка не входить до оболоч ку, але може бути корисна для роботи з каналами Одне з її можливих застосувань – це збереження проміжного висновку у файлі:

$ (date who)  | tee  save  | wc

3         16         89                                   Висновок зwc

$ cat  save

Wed  Sep  28  09:13:22  EDT  1983 you           tty2        Sep  28  07:51 jpl           tty4        Sep  28  08:32

$ wc &ltsave

3         16         89

$

Команда tee копіює свій введення в зазначений файл або файли, а також у свій висновок, так що wc отримує ті ж вхідні дані, які б вона отримала, якби tee не входила в конвеєр

Як покажчика кінця команди також може виступати амперсанд & Він діє так само, як крапка з комою або роздільник рядків, за винятком того, що цей символ вказує оболонці, що не слід чекати завершення команди Амперсанд & зазвичай застосовується для виконання тривалої команди «у фоновому режимі», при тому, що в цей же час вводяться інтерактивні команди:

$ long-running-command & Команда з великим часом виконання

$                                               Запрошення на введення зявляється відразу ж

Можна і більш цікаво використовувати фонові процеси, якщо задіяти можливість угрупування команд Команда sleep чекає вказану кількість секунд, перш ніж завершитися:

$ sleep 5

$                                                            Запрошення зявляється через 5 секунд

$ (sleep 5  date) &amp   date

5278

Wed  Sep 28 09:18:20  EDT  1983O      Висновок другий команди date

$ Wed  Sep 28 09:18:25  EDT  1983     Запрошення, через 5 секунд date

Шпалери процес запускається і відразу ж засинає тим часом друга команда date друкує поточний час, і оболонка видає запрошення на введення нової команди Через пять секунд sleep завершується, і перша команда date друкує новий час Важко пояснити протягом часу на папері, так що краще спробуйте запустити цей приклад на компютері (Залежно від завантаженості компютера і неко-

торих інших причин, проміжок часу між двома подіями може становити не рівно пять секунд) Таким чином, не складає труднощів запустити команду в майбутньому можна, наприклад, реалізувати зручне нагадування

$ (Sleep 300 echo Tea is ready) & Чай буде готовий через 5 хвилин

5291

$

(Якщо в рядку, яка повинна бути відображена на терміналі, присутній ctl-G, то при виведенні пролунає звуковий сигнал) Використання дужок у цих прикладах необхідно, оскільки пріоритет амперсанда вище, ніж у крапки з комою

Амперсанд як покажчик кінця застосовується до команд, а так як конвеєр – це команда, то для запуску конвеєра у фоновому режимі наявність дужок у записі не потрібно:

$ pr  file | lpr  &amp

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

$ (Pr file | lpr) & Аналогічно попередньому прикладу

Більшість програм беруть в командному рядку аргументи, Як file (аргумент pr) в останньому прикладі Аргументи – це слова, розділені пробілами і знаками табуляції, звичайно представляють собою імена файлів для обробки, але, будучи рядками, можуть бути інтерпретовані програмою будь-яким підходящим для неї спосіб Наприклад, pr приймає імена файлів для друку, echo відображає свої аргументи на термінал без інтерпретації, а перший аргумент grep задає текстовий шаблон, який повинен використовуватися при пошуку І, звичайно ж, багато програми також мають параметри, які вказуються аргументами, що починаються зі знака мінус

Різні спеціальні символи, що інтерпретуються оболонкою (такі, як <,>, |, і &), не є аргументами запускаються Замість цього вони контролюють те, як оболонка їх запускає Наприклад,

$ echo Hello  &gtjunk

Тут повідомляється, що оболонка має запустити echo з єдиним аргументом Hello і помістити висновок у файл junk Рядок> junk не є аргументом команди echo вона інтерпретується оболонкою, і ec-ho її навіть не бачить Насправді цей рядок не обовязково повинна бути останньою в команді:

$ &gtjunk echo Hello

У цьому випадку відбувається те ж саме, але така запис менш очевидна

Вправа 31 У чому відмінності трьох команд, наведених нижче

$ cat  file | pr

$ pr  &ltfile

$ pr  file

(З роками оператор перенаправлення <поступився в популярності каналам, схоже, конструкція cat file | здається людям більш природною, ніж

Джерело: Керниган Б, Пайк Р, 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>

*

*