UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Сравните предложенный здесь подход и реализацию команды news с аналогичной командой вашей системы.
5.9 Команды
getputВ последнем разделе этой длинной главы мы приведем большой и более сложный пример, в котором продемонстрируем вам взаимодействие языков
shellawksedПрограмма развивается по мере того, как мы устраняем ошибки и добавляем в нее новые средства. Иногда полезно сохранять ее разные версии, особенно в ситуации, когда кто-то переносит программу на другую машину, и возникает вопрос: "Что изменилось с тех пор, как мы получили версию вашей программы?" или "Как вы устранили такие- то ошибки?" К тому же наличие копий упрощает эксперимент: если у вас что-либо не получилось, то можно безболезненно вернуться к исходной программе.
Одно из решений состоит в том, чтобы хранить копии всех версий программы, но это трудно организовать и, кроме того, требует большого объема памяти на диске. Мы же будем основываться на подобии последовательных версий, что позволяет хранить только их общую часть. Команда
$ diff -е old newпорождает список команд редактора
edoldnewСуществуют два очевидных решения: хранить целиком последнюю версию и иметь команды редактирования для возврата к старым версиям или хранить самую старую версию и иметь команды редактирования для перехода к новым. Хотя второе решение чуть проще запрограммировать, первое предпочтительнее, поскольку из множества версий почти всегда интереснее выбрать новые.
Мы рассмотрим первое решение. В едином файле, называемом файлом истории, хранится текущая версия, за которой следует множество команд редактирования, преобразующих каждую версию в предыдущую (т.е. более старую). Любой набор команд редактирования начинается такой строкой:
@@@ пользователь дата сводкаСводка — это одна строка, которая вводится пользователем и описывает изменения.
Для работы с версиями используются две команды:
getputgetput$ echo строка текста > junk$ put junkSummary: создадим новый файл get: no file junk.H put: creating junk.H $ cat junk.Hстрока текста@@@ you Sat Oct 1 13:31:03 EDT 1983 $ echo еще строка >>junk$ put junkSummary: одна строка добавлена$ cat junk.Hстрока текстаеще одна строка текста@@@ you Sat Oct 1 13:31:28 EDT 1983 одна строка добавлена2d@@@ you Sat Oct 1 13:31:03 EDT 1983 сделаем новый файл$Команды редактирования представляют собой одну строку 2, которая исключает вторую строку файла, преобразуя новую версию в исходную:
$ rm junk$ get junk $ cat junk строка текста еще строка текста$ get -l junk$ cat junk строка текста$ get junk $ replace еще 'другая' junk $ put junkSummary: изменена вторая строка$ cat junk.Hстрока текстадругая строка@@@ you Sat Oct 1 13:34:07 EDT 1983 одна строка добавлена2d@@@ you Sat Oct 1 13:31:03 EDT 1983 создадим новый файл$Для получения нужной версии файла в файле истории записаны команды редактирования. Первая группа команд преобразует самую последнюю версию в предыдущую, вторая группа преобразует предыдущую в пред-предыдущую версию и т.д. Таким образом, мы преобразуем новый файл в его старую версию, запуская каждый раз редактор
edОчевидно, может возникнуть проблема, если в изменяемом файле есть строки, начинающиеся с трех символов. Кроме того, в разделе ошибок описания команды
diff(1)@@@Конечно, было бы полезно показать здесь процесс развития команд
putgetputget# put: install file into historyPATH=/bin:/usr/bincase $# in1) HIST=$1.H ;;*) echo 'Usage: put file' 1>&2; exit 1 ;;esacif test ! -r $1then echo "put: can't open $1" 1>&2 exit 1fitrap 'rm -f /tmp/put.[ab]$$; exit 1' 1 2 15echo -n 'Summary: '
