В данном практическом примере происходит изменение файла, существующего на целевом компьютере в ходе установки пакета. Здесь используется один из трех способов изменения файла. Два других способа описаны в разделахИзменение файла с помощью стандартных классов и сценариев действий над классами и Изменение файла с помощью класса build. Изменяемый файл называется /etc/inittab.
В практическом примере применяются следующие ниже методы.
Использование класса sed
Для получения дополнительной информации о классе sed см. раздел Сценарий класса sed .
Использование сценария postinstall
Для получения дополнительной информации об этом сценарии см. раздел Создание процедурных сценариев .
Для изменения файла /etc/inittab в ходе установки с помощью класса sed, необходимо выполнить следующие задачи:
Добавьте сценарий класса sed в файл prototype.
Название сценария должно совпадать с именем файла, который предстоит редактировать. В нашем случае редактируемый файл называется /etc/inittab, и сценарий sed также будет называться /etc/inittab. В сценарии sed отсутствуют требования по режиму, владельцу и группе (они представлены в образце файла prototype вопросительными знаками). Файл сценария sed должен относиться к типу e (редактируемый).
Включите в параметр CLASSES класс sed.
Как показано в примере ниже, sed является единственным устанавливаемым классом. Однако количество классов может быть любым.
Создать сценарий действия над классом sed.
В пакет не может быть включена копия файла /etc/inittabв необходимом виде, поскольку /etc/inittab является динамическим файлом и неизвестно, как он будет выглядеть в период установки пакета. Однако сценарий sed позволяет изменять файл /etc/inittab в ходе установки пакета.
Создайте сценарий postinstall.
Необходимо выполнить команду init q для извещения системы о том, что файл /etc/inittab был изменен. Единственное место, где можно выполнить это действие в нашем примере, это сценарий postinstall. При рассмотрении примера сценария postinstall видно, что его единственное предназначение - выполнение команды init q.
Данный подход к изменению файла /etc/inittab в ходе установки имеет один недостаток - приходится поставлять полный сценарий (сценарий postinstall) лишь для того, чтобы выполнить команду init q.
PKG=case4 NAME=Case Study #4 CATEGORY=applications BASEDIR=/opt ARCH=SPARC VERSION=Version 1d05 CLASSES=sed |
i pkginfo i postinstall e sed /etc/inittab ? ? ? |
!remove # remove all entries from the table that are associated # with this package, though not necessarily just # with this package instance /^[^:]*:[^:]*:[^:]*:[^#]*#ROBOT$/d !install # remove any previous entry added to the table # for this particular change /^[^:]*:[^:]*:[^:]*:[^#]*#ROBOT$/d # add the needed entry at the end of the table; # sed(1) does not properly interpret the '$a' # construct if you previously deleted the last # line, so the command # $a\ # rb:023456:wait:/usr/robot/bin/setup #ROBOT # will not work here if the file already contained # the modification. Instead, you will settle for # inserting the entry before the last line! $i\ rb:023456:wait:/usr/robot/bin/setup #ROBOT |
# make init re-read inittab /sbin/init q || exit 2 exit 0 |