Теперь давайте добавим несколько элементов управления в наш скрипт. Как вы знаете, rc.d скрипты управляются из файла rc.conf(5). К счастью, rc.subr(8) скрывает от нас все сложные элементы разбора и анализа. Приведенный далее скрипт проверяет, было ли разрешено его выполнение в фале rc.conf(5), и если оно было разрешено, выводит сообщение при загрузке. Фактически, две эти задачи совершенно независимы. С одной стороны, rc.d скрипт поддерживает разрешение и запрещение его исполнения через rc.conf(5), с другой стороны rc.d может иметь конфигурационные переменные. Мы реализуем обе эти возможности в нашем скрипте:
#!/bin/sh . /etc/rc.subr name="dummy" rcvar=`set_rcvar`start_cmd="${name}_start" stop_cmd=":" load_rc_config $name
eval "${rcvar}=\${${rcvar}:-'NO'}"
dummy_msg=${dummy_msg:-"Nothing started."}
dummy_start() { echo "$dummy_msg"
} run_rc_command "$1"
Что изменилось в этом примере?

set_rcvar обусловлена тем, что разные операционные
системы используют разные соглашения в именовании переменных. Например, FreeBSD
использует переменные вида ${name}_enable, а NetBSD использует ${name} в файле rc.conf(5). Таким
образом, наш скрипт будет руководствоваться значением переменной dummy_enable под FreeBSD и значением переменной dummy под NetBSD.
load_rc_config вызывается до загрузки переменных
из rc.conf(5)Note: При изучении rc.d скриптов, помните, что sh(1) откладывает интерпретацию переменных до момента, когда они будут фактически вызваны, то есть, не является ошибкой вызвать
load_rc_configпозже, но до вызоваrun_rc_command.

run_rc_command выдаст предупреждение,
если переменная rcvar определена, но для нее не выставлено
значение. Если ваш rc.d скрипт предназначен для базовой
системы, вы должны добавить значения по-умолчанию для него в файл /etc/defaults/rc.conf и задокументировать их в rc.conf(5). В
противном случае, вы должны определить значения по-умолчанию в самом скрипте. Переносимый
вариант последнего случая показан в нашем примере.Note: Вы можете заставить rc.subr(8) действовать так, как будто значение управляющей переменной выставлено в ON независимо от реального значения добавляя к аргументу скрипта префиксы one или force, таким образом запуская скрипт с опциями
onestartилиforcestop. Помните, что force имеет ряд опасных побочных эффектов, которые мы обсудим позже, в то время как one просто переопределяет значение ON/OFF переменной. Другими словами, если предположить, что значение переменной dummy_enable установлено в OFF, следующая команда выполнит методstartвопреки этому значению:# /etc/rc.d/dummy onestart

Important: Все rc.conf(5) переменные, используемые только нашим скриптом, должны иметь один и тот же префикс: ${name}. Например, dummy_mode, dummy_state_file, и так далее.
Note: Хотя вполне возможно использовать внутри скрипта короткие имена переменных, то есть просто msg, тем не менее добавление уникального префикса ${name} ко всем глобальным переменным, используемым нашим скриптом предохранит нас от потенциальных переопределений переменных из пространства имен rc.subr(8).
До тех пор, пока переменные из rc.conf(5) и их используемые в скрипте эквиваленты одинаковы, мы можем использовать более компактную запись для установки значения по-умолчанию:
: ${dummy_msg:="Nothing started."}Хотя, в текущем соглашении о стиле все же рекомендуется использовать более развернутую форму записи.
Как правило, для rc.d скриптов базовой системы не устанавливают значения по-умолчанию в файле rc.conf(5), поскольку эти значения должны находиться в файле /etc/defaults/rc.conf. С другой стороны, скрипты из системы портов должны устанавливать значения по-умолчанию сами, как это было сделано в нашем скрипте.

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.