Відстеження змін файлу: get і put

У цьому розділі, завершальному довгу главу, обговорюватиметься великий і складніший, ніж розглянуті раніше, приклад, який ілюструє взаємодію оболонки з програмами awk і sed

Програма розвивається в міру виправлення помилок і додавання нових можливостей Буває зручно відстежувати ці версії, особливо якщо з ними працюють на інших машинах Користувачі цілком можуть запитати: «Що змінилося з тих пір, як ми отримали цю версію» Або: «Як виправлена ​​така-то помилка» До того ж при наявності резервної копії застосування нових ідей буде більш безпечним: якщо щось не запрацює, можна безболісно повернутися до вихідної програмі

В якості одного з рішень можна запропонувати зберігати копії всіх версій, але це важко організувати, до того ж потрібно багато диско-

вого простору Замість цього отримаємо вигоду з такого припущення: у наступних один за одним версій має бути дуже багато спільного, яке можна зберегти тільки одного разу Команда diff-e

$ diff -e  old  new

генерує список команд ed, які перетворять old в new Таким чином, можна зберігати всі версії файлу в одному (окремому) файлі, зберігаючи одну повну версію і набір команд редактора, що перетворюють її в будь-яку іншу версію

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

Отже, зупинимося на першому варіанті У єдиному файлі, назвемо його файлом передісторії (history file), знаходиться поточна версія та набори редактирующих команд, які перетворюють кожну версію в попередню (тобто в найближчу старішу) Кожен набір команд редактора починається з рядка, що виглядає наступним чином:

@@@   користувач дата зведення

Зведення – Це один рядок, що описує зміни, надана

користувачем

Є дві команди для зберігання версій: get витягує версію з файлу передісторії, а put вносить нову версію в цей файл, попередньо запросивши однорядкове повідомлення про зміни

Перш ніж представити програму, наведемо приклад, що показує, як працюють get і put і як зберігаються версії:

$ echo a line  of  text &gtjunk

$ put  junk

Summary:  make  a new  file                Введіть опис

get: no file  junkH                                Історії не існує ..

put: creating  junkH                              .. Тому put створює її

$ cat  junkH

a line  of  text

@@@   you Sat  Oct   1 13:31:03  EDT  1983 make a  new file

$ echo another  line  &gt&gtjunk

$ put  junk

Summary:  one line added

$ cat  junkH

a line  of  text another  line

@@@   you Sat  Oct   1  13:32:28  EDT  1983 one line  added 2d

@@@   you Sat  Oct   1 13:31:03  EDT  1983 make a  new file

$

«Набір редактирующих команд» складається з однієї-єдиної рядки 2d, яка видаляє рядок 2 у файлі, перетворюючи нову версію у вихідну

$ rm junk

$ get junk Найновіша версія

$ cat  junk

a line  of  text another  line

$ get  -1  junk

$ cat junk Попередня перед самою новою версією

a line  of  text

$ get junk Знову сама нова версія

$ replace another a different junk Змінити її

$ put  junk

Summary:  second  line  changed

$ cat  junkH

a line  of  text

a different line

@@@   you Sat  Oct   1 13:34:07  EDT  1983 second  line changed 2c

another line

.

@@@   you Sat  Oct   1  13:32:28  EDT  1983 one line  added 2d

@@@   you Sat  Oct   1 13:31:03  EDT  1983 make a  new file

$

Редагують команди, извлекающие потрібну версію, проганяються по файлу зверху вниз: перший набір перетворить новітню версію в другу за свіжістю, наступний набір перетворює другу в третьому, і т д Тому насправді перетворення нового файлу в старий при виконанні команд ed відбувається поступово, по одній версії за раз

Труднощі можуть виникнути, якщо у файлі є рядки, що починаються з трьох символів @, а розділ BUGS команди diff (1) попереджає про рядках, які містять тільки крапку Саме тому, що позна чення @ @ @ Навряд чи може зустрітися в тексті, воно було вибрано для маркування команд редагування

Незважаючи на те що було б повчально показати, як розвивалися команди get і put, вони досить довгі і опис їх різних форм зайняло б занадто багато часу Тому представлені будуть тільки їх остаточні версії Команда put простіше:

# Put: ввести файл в історію PATH = / bin :/ usr / bin

case  $# in

1)    HIST=H  ;

*)    echo Usage:  put  file 1&gt&amp2  exit 1 ;

esac

if test  –r   then

echo  &quotput:  cant  open  &quot  1&gt&amp2 exit  1

fi

trap rm  –f  /tmp/put[ab]$  exit  1 1 2 15 echo  –n Summary:

read  Summary

if get-o / tmp / puta $ $ $ 1 # попередня версія

then # обєднати частини разом cp $ 1 / tmp / putb $ $ # поточна версія

echo &quot@@@   `getname`  `date` $Summary&quot  &gt&gt/tmp/putb$

diff-e $ 1 / tmp / puta $ $ >> / tmp / putb $ $ # останні відмінності sed-n / ^ @ @ @ /, $ p <$ HIST >> / tmp / putb $ $ # старі відмінності overwrite $ HIST cat / tmp / putb $ $ # помістити назад

else # створити новий echo put: creating $ HIST

cp $HIST

echo &quot@@@   `getname`  `date` $Summary&quot  &gt&gt$HIST

fi

rm –f  /tmp/put[ab]$

Після зчитування однорядковою зведення змін put викликає get для того, щоб витягти попередню версію файлу з файлу передісторії Параметр-o команди get вказує альтернативний файл для виводу Якщо get не знаходить файлу передісторії, вона повертає код помилки, і put створює новий файл передісторії Якщо ж файл існує, то оператор then створює нову історію в тимчасовому файлі з (по порядку) самої нової версії, рядки @ @ @, команд редактора, що перетворюють новітню версію в найближчу попередню, старих команд редактора і рядків @ @ @ На закінчення тимчасовий файл копіюється в файл передісторії допомогою команди overwrite

Команда get складніше, ніж put, в основному тому, що у неї є пара метри

# Get: витягти файл з історії PATH = / bin :/ usr / bin

VERSION=0

while  test  &quot&quot  =  &quot&quot do

case  &quot&quot  in

–i) INPUT=

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


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

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

Ваш отзыв

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

*

*