4 Настраиваемый простейший скрипт

Теперь давайте добавим несколько элементов управления в наш скрипт. Как вы знаете, 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`(1)
start_cmd="${name}_start"
stop_cmd=":"

load_rc_config $name(2)
eval "${rcvar}=\${${rcvar}:-'NO'}"(3)
dummy_msg=${dummy_msg:-"Nothing started."}(4)

dummy_start()
{
    echo "$dummy_msg"(5)
}

run_rc_command "$1"

Что изменилось в этом примере?

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

Note: При изучении rc.d скриптов, помните, что sh(1) откладывает интерпретацию переменных до момента, когда они будут фактически вызваны, то есть, не является ошибкой вызвать load_rc_config позже, но до вызова run_rc_command.

(3)
Вызов функции 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
(4)
Теперь сообщение, выводимое скриптом при старте, не является жестко прописанным в скрипте и неизменным. Оно может быть определено как переменная dummy_msg в rc.conf(5). Это простейший пример того, как переменные rc.conf(5) могут управлять поведением rc.d скрипта.

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. С другой стороны, скрипты из системы портов должны устанавливать значения по-умолчанию сами, как это было сделано в нашем скрипте.

(5)
Здесь мы используем переменную dummy_msg непосредственно для действия, то есть чтобы отобразить сообщение.

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

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