Быстрый старт: первый шаблон за пять минут

Обновлено 5 ноября 2026

Три примера от простого к полезному. Каждый — законченный: создал, применил, проверил.

Пример 1. Изменить один параметр, не трогая файл

Допустим, нужно задать редактор по умолчанию для всех пользователей. Файл /etc/profile.d/editor.sh уже существует — его создаёт система, и руками править его бессмысленно: при переустановке пакета изменения пропадут.

Создайте файл шаблона в локальном хранилище (нужны права суперпользователя):

/var/calculate/templates/editor.sh

# Calculate env=install ac_install_merge==on path=/etc/profile.d comment=#
export EDITOR="nano"

Что здесь написано:

  • env=install ac_install_merge==on — применять шаблон во время настройки пакета. Переменная действия принадлежит модулю install, поэтому её пишут вместе с env=install: без него движок отвечает Не найдена переменная ac_install_merge и шаблон не налагается. У файла первого уровня в пользовательском хранилище такая переменная обязательна, без неё шаблон молча пропускается;
  • path=/etc/profile.d — куда положить результат; имя файла возьмётся из имени шаблона (editor.sh);
  • comment=# — так как формат не указан, файл считается «сырым» и пишется целиком; символ комментария нужен, чтобы утилиты вписали сверху служебный заголовок, не сломав синтаксис bash.

Если шаблон читает переменные конкретного модуля (#-os_install_*-#), к заголовку добавляют env=<модуль>; здесь тело переменных не читает, поэтому env= лишнее. Как он работает — в Синтаксисе шаблона.

Теперь примените шаблоны этого пакета:

cl-core-setup -n baselayout

Проверьте результат — файл содержит ваш export и пометку, из какого шаблона он взят:

cat /etc/profile.d/editor.sh
#------------------------------------------------------------------------------
# Modified Calculate Utilities 3.7.6.8
# Processed template files:
# /var/db/repos/calculate/profiles/templates/2_ac_install_merge/sys-apps/baselayout/editor.sh
# /var/calculate/templates/editor.sh
# To modify this file, create a /etc/profile.d/editor.sh.clt template.
#------------------------------------------------------------------------------
export EDITOR="nano"

Служебный заголовок — не украшение: по нему утилиты узнают, что файл им управляем, и при следующем наложении заменят только своё, не трогая остальное.

Пример 2. Точечная правка конфигурационного файла пакета

Для файлов знакомых форматов копировать содержимое не нужно — укажите формат, и шаблон опишет только изменяемые параметры. Пусть надо включить переадресацию пакетов. В Calculate настройки ядра правят файлами-«дропинами» в /etc/sysctl.d, и принадлежат они пакету sys-apps/openrc — ровно так же устроены шаблоны самого дистрибутива:

/var/calculate/templates/merge/.calculate_directory

# Calculate env=install ac_install_merge==on append=skip

/var/calculate/templates/merge/calculate_forward.conf

# Calculate format=procmail mergepkg(sys-apps/openrc)!= path=/etc/sysctl.d
net.ipv4.ip_forward = 1

Здесь два файла, и оба нужны. В пользовательском хранилище каждый элемент первого уровня проверяется отдельно от вложенных: если у каталога нет своей переменной действия, всё поддерево пропускается молча — в подробном выводе вы увидите только Пропущенные директории. Поэтому заголовок каталога обязан содержать env=install ac_install_merge==on; эта переменная действует и на файлы внутри каталога, так что в самом шаблоне её можно не повторять. А append=skip нужен, чтобы каталог сам не стал шаблоном: без него в системе будет создан каталог /<имя> (тут — /merge), и он останется висеть в корне мусором.

mergepkg(sys-apps/openrc)!= привязывает шаблон к пакету: он сработает при настройке sys-apps/openrc и не будет мешать, когда настраивается что-то другое. Существующие файлы при этом не переписываются: утилита меняет только указанную запись, остальные ваши настройки остаются на месте.

Проверка та же — примените шаблоны пакета:

cl-core-setup -n openrc

Затем проверьте результат:

grep ip_forward /etc/sysctl.d/calculate_forward.conf

Пример 3. Переопределение через .clt — без хранилища шаблонов

Самый короткий способ поменять настройку конкретного файла — положить шаблон рядом с ним, с расширением .clt. Он наследует путь и имя из своего расположения: /etc/conf.d/consolefont.clt настраивает /etc/conf.d/consolefont.

/etc/conf.d/consolefont.clt

# Calculate format=openrc
consolefont="ter-v12n"

path=, name= и env=install здесь не нужны — путь, имя и пакет выводятся из расположения самого шаблона и из владения целевым файлом. Не нужен и ac_install_merge==on: .clt применяется при обновлении пакета и без него. Записанный явно, это обычное условие — и при выключенной переменной шаблон будет пропущен. Применяется обычным обновлением пакета:

emerge -a1 openrc

grep ^consolefont /etc/conf.d/consolefont
consolefont="ter-v12n"

Меняет ли .clt файл на месте, зависит от состояния цели. Если конфигурационный файл отличается от того, что записан в списке файлов пакета (его правили вручную либо он пересоздавался), движок бережёт вашу версию и кладёт результат рядом — в ._cfg0000_consolefont, а цель остаётся прежней. На нетронутом файле тот же шаблон меняет цель на месте. Проверить, какому пакету принадлежит файл и нет ли расхождений, помогают equery b <файл> и qcheck <пакет>.

Не копируйте в .clt весь файл целиком: без format= это будет «сырой» шаблон, который перезапишет конфиг полностью и не оставит служебного заголовка. Двух строк с форматом достаточно.

Группировка шаблонов: директория — тоже шаблон

Когда шаблонов несколько, общие условия выносят в заголовок директории. Он хранится в файле .calculate_directory и наследуется всем, что внутри:

/var/calculate/templates/merge/.calculate_directory

# Calculate append=skip env=install ac_install_merge==on
  • env=install ac_install_merge==on больше не нужно повторять в каждом шаблоне внутри;
  • append=skip означает, что сама директория в систему не переносится (иначе утилиты создали бы /merge).

Файлы внутри становятся короче:

/var/calculate/templates/merge/ncurses.sh

# Calculate mergepkg(sys-libs/ncurses)!= path=/etc/profile.d comment=#
export LDFLAGS="${LDFLAGS} -ltinfo"

Как убедиться, что всё правильно

Шаблоны связаны с пакетным менеджером: файл, созданный шаблоном для пакета, регистрируется в его составе и проходит проверку контрольных сумм. Взять хотя бы /etc/profile.d/editor.sh — его создаёт шаблон editor.sh из репозитория calculate:

equery f sys-apps/baselayout | grep profile.d
/etc/profile.d
/etc/profile.d/editor.sh
equery b /etc/profile.d/editor.sh
sys-apps/baselayout-2.18-r1 (/etc/profile.d/editor.sh)
qcheck sys-apps/baselayout
Checking sys-apps/baselayout ...
 MTIME: /etc/mtab
  * 41 out of 42 files are good

Строка MTIME: /etc/mtab — не ошибка шаблона: этот файл меняется при загрузке системы, и qcheck честно сообщает о расхождении времени. Если же расхождение касается файла, созданного вашим шаблоном, обычно виновата привязка к пакету: не указан mergepkg()/pkg(), и файл попал в «настройку всей системы», а не в состав пакета. Об этом — в разделе Жизнь файла после шаблона.

Дальше