Команда news: службові повідомлення

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

Основною ідеєю програм такого роду є зберігання персональних новин в спеціальному каталозі (по одній в файлі) / usr / news Тоді news (це і є розглянута програма news) порівнює час зміни файлів в / usr / news з часом зміни файлу в домашньому каталозі ( news_time), який служить тимчасовою міткою При налагодженні можна використовувати «» Як каталог і для файлів Новос-

тей і для news_time коли ж програма буде готова до роботи, його можна буде замінити на / usr / news

$ cat  news

# News: виводити файли новин, версія 1

HOME = # Лише для налагодження

cd # Символ-заповнювач для / usr / news for i in `ls-t * $ HOME / news_time`

do

done

case  $i  in

*/news_time)     break  ;

*)           echo  news:  $i esac

touch  $HOME/news_time

$ touch  news_time

$ touch  x

$ touch  y

$ news news:  y news:  x

$

Команда touch змінює час модифікування файлу, що є її аргументом, на поточний час, не змінюючи сам файл Для Налагодити ки виведені тільки імена файлів, а не їх вміст Цикл завершується, коли доходить до news_time, тому перераховуються тільки більш нові файли Зверніть увагу, що * в операторах case може відповідати /, що неможливо в шаблонах імен файлів

Що відбудеться, якщо News_time не існує

$ rm news_time

$ news

$

Таке несподіване мовчання – помилка Це трапилося тому, що ls не знайшла файл, і вона повідомляє про виниклу проблему на свій пристрій стандартного виведення, перш ніж вивести яку б то не було інформацію про існуючі файлах Помилка безсумнівна – діагностика повинна виводитися на пристрій стандартного виведення помилок, – але її можна обійти, розпізнавши наявну проблему в циклі і пере направивши висновок стандартних помилок на стандартний висновок, щоб всі версії працювали однаково (В останніх версіях системи ця помилка була виправлена, ми залишили її для того, щоб показати, як можна впоратися з невеликими неполадками)

$ cat  news

# News: виводити файли новин, версія 2

HOME = # Лише для налагодження

cd # Символ-заповнювач для / usr / news

IFS=

‘# Тільки символ роздільник рядків for i in `ls-t * $ HOME / news_time 2> & 1`

do

done

case  $i  in

* not  found)   ;

*/news_time)     break  ;

*)           echo  news:  $i  ; esac

touch  $HOME/news_time

$ rm news_time

$ news news:  news news:  y news:  x

$

Мінлива IFS містить тільки роздільник рядків, тому повідомлення

./news_time  not  found

не розбирається на три слова

Після цього news повинна виводити файли новин, а не показувати їх імена Корисно знати, хто відправив повідомлення і коли, тому будемо використовувати команду set і ls-l для того, щоб друкувати перед повідомленням заголовок:

$ ls -l news

–rwxrwxrwx  1 you                208 Oct    1 12:05  news

$ set  `ls -l news`

–rwxrwxrwx: bad option(s)                                          Что5то не так

$

Ось приклад того, як проявляється однаковість програм і даних в оболонці Команда set висловлює невдоволення, тому що її аргумент (-rwxrwxrwx) починається зі знака мінус, нагадуючи тим самим пара метр Простий (хоча і некрасивий) спосіб вирішення ситуації полягає в тому, щоб випередити аргумент звичайним символом:

$ set  X`ls   -l news`

$ echo &quotnews:  ($3)  $5 $6 $7&quot

news:  (you)  Oct 1 12:05

$

Формат виводу зручний: поряд з імям файлу вказується автор і дата повідомлення

Готова остаточна версія команди news:

# News: виводити файли новин, остаточна версія PATH = / bin :/ usr / bin

IFS=

‘# Тільки роздільник рядків cd / usr / news

for  i in  `ls –t  *  $HOME/news_time  2&gt&amp1` do

IFS=   case  $i  in

* not  found)   ;

*/news_time)     break  ;

*)    set  X`ls  –l  $i` echo  &quot

$i:  ($3)  $5  $6 $7 &quot

done

cat  $i esac

touch  $HOME/news_time

Додаткові символи нового рядка в заголовку поділяють повідомлення по мірі друку Спочатку значення IFS – це символ нового рядка, тому повідомлення not found (якщо воно виводиться) першої команди ls обробляється як єдиний аргумент При другому присвоєнні значенням IFS стає пробіл, тому висновок другий ls раз Біван на безліч аргументів

Вправа 527 Додайте параметр-n (notify – повідомити) для команди news, щоб сповіщати про нові повідомлення, але не виводити їх і не звертатися до News_time Таку команду можна додати в Profile ~

Вправа 528Порівняйте принцип роботи та реалізацію команди news, запропоновані в цій книзі, з відповідною командою вашої системи ~

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

*

*