$ echo $MYFILE
cat testf
Теперь применим команду eval для оценки значения переменной; при этом следует помнить, что eval выполняет два прохода при оценке переменной myfile.
$ eval $MYFILE
May Day, May Day Going Down
В результате этого успешно оценивается значение переменной и применяется команда cat к файлу testf. При первом проходе отображается фактическая строка "cat testf", при втором проходе выполняется содержимое строки, в данном случае cat testf.
Рассмотрим другой пример. Переменной cat_passwd будет присвоена строка "cat /etc/passwd | more". Команда eval выполняет оценку содержимого данной строки.
$ CAT_PASSWD=`cat /etc/passwd | more`
$ echo $CAT_PASSWD
cat /etc/passwd|more
$ eval
$CAT_PASSWD
root:HccPbzT5tbOOg:0:0:root:/root:/bin/sh
bin:*:class="underline" class="underline" bin:/bin:
daemon:*:2:2:daemon:/sbin:
adm:*:3:4:ada:/var/adm:
Команда eval также хорошо подходит для отображения значения последнего параметра, передаваемого сценарию. Значение последнего параметра уже отображалось, но в этом случае оно будет отображено снова.
$ pg evalit
#!/bin/sh
# сценарий evalit
echo " Total number of arguments passed is $#"
echo " The process ID is $$"
echo "' Last argument is "$(eval echo \$$)
При выполнении этого сценария получим следующий результат (ID процесса может отличаться от случая к случаю):
$ evalit alpha bravo charlie
Total number of arguments passed is 3
The process ID is 780
Last argument is Charlie
В этом сценарии команда eval сначала оценивает значение переменной $$ в сравнении с ID процесса, а при выполнении второго прохода производится оценка последнего параметра, передаваемого переменной.
26.4.2. Присвоение значения имени переменной
Можно также поставить в соответствие полю данных имя переменной. Рассмотрим, что это означает на практике. Предположим, что в нашем распоряжении имеется следующий файл:
$ pg data
PC 486 MONITOR svga NETWORK yes
Нам необходимо, чтобы первому столбцу текста соответствовали имена переменных, а второму столбцу текста — значения соответствующих переменных. При этом должно отображаться следующее:
echo $PC
466
Как же можно достичь желаемого результата? Ниже приведен соответствующий сценарий, использующий команду eval.
$ pg eval_it
#!/bin/sh
#сценарий eval_it
while read NAME TYPE
do
eval `echo "${NAME}=${TYPE}"`
done < data
echo "You have a $PC pc, with a $MONITOR monitor"
echo "and have you network? $NETWORK"
Рассмотрим, как функционирует сценарий. Сначала берутся значения рс и 486, которые присваиваются переменным name и type соответственно. При первом проходе команда eval отображает на экране два значения переменных, PC и 486; во время выполнения второго прохода вместо переменной name подставляется значение рс, а вместо переменной type — значение 486. При выполнении сценария получаются следующие результаты:
$ eval_it
You have a 486 рс, with a svga monitor and have you network? yes
Команда eval не слишком часто применяется в сценариях, однако ее удобно использовать при оценке значения переменной, выполняемой более одного раза.
26.5. Команда logger
В системе поддерживается достаточно много журнальных файлов. Некоторые из них, именуемые messages, обычно размещены в каталоге /var/adm или /var/log. Сообщения, регистрируемые в этом файле, передаются с помощью файла конфигурации syslog и имеют строго заданный формат. Чтобы убедиться, что система сконфигурирована для генерирования сообщений из программ, проверьте файл /etc/syslog.conf. Этот файл содержит описания приоритетов и свойств, которые программа может использовать для отсылки различных типов сообщений.
Здесь мы не будем подобно рассматривать, каким образом UNIX либо Linux регистрирует сообщения в файле. Все, что вам требуется пока знать, это номера различных уровней сообщений (от информационных до критических).
Сообщения могут отсылаться в файл с помощью команды logger. Перед тем как использовать эту команду, нужно обратиться к справочной странице man, так как различные версии этой команды могут иметь отличающийся синтаксис. Поскольку в этой главе рассматриваются только информационные сообщения, нужно обратить внимание на соответствующие команды, рассматриваемые далее.
Необходимость отправки сообщений в файл диктуется одной из следующих причин:
• количество попыток доступа/регистрации за определенный период;
• критическая обработка одного из сбойных сценариев;
• мониторинг отчетов сценариев.
Ниже показано, как выглядит файл /var/adm/messages. Формат этого файла может немного отличаться от данного образца: