Выбрать главу

$ 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. Формат этого файла может немного отличаться от данного образца: