Литмир - Электронная Библиотека

26.4. Команда eval

Команда eval служит для оценки командной строки с целью завершения каких‑либо подстановок интерпретатора shell с последующим их вызовом. Команда eval используется для расширения значений переменных (если в результате одного прохода расширения не происходит, выполняется второй проход). Переменные, для оценки которых требуется два прохода, иногда называют сложными переменными. Хотя, по моему мнению, переменные не могут быть сложными.

Команда eval также может применяться для отображения значений простых переменных; эти переменные не должны быть сложными.

$ NAME=Honeysuckle

$ eval echo $NAME

Honeysuckle

$ echo $NAME

Honeysuckle

Наилучшим методом для понимания работы команды eval является изучение оценки командной строки, выполняемой этой командой.

26.4.1. Выполнение команд, находящихся в строке

Вначале создадим небольшой файл, testf, содержащий некоторый текст. Затем переменной myfile будет присвоена команда cat testf с последующим отображением значения переменной. Благодаря этому можно проверить возможность отображения на экране содержимого файла testf.

$ pg testf

May Day, May Day Going Down

Присвоим переменной myfile строку "cat testf:

$ MYFILE="cat testf"

Если требуется вывести содержимое файла testf на экран, нужно выполнить команду cat testf.

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

$ tail /var/adm/messages

Jun 16 20:59:03 localhost login[281]: DIALUP AT ttyS1 BY root

Jun 16 20:59:03 localhost login[281]: ROOT LOGIN ON tty$1

Jun 16 20:59:04 localhost PAM_pwdb [281] : (login) session closed for user root

Jun 16 21:56:38 localhost named[211: Cleaned cache of 0 RRs]

Jun 16 21:56:39 localhost named[211]: USAGE 929570318 929566719

Jun 16 21:56:39 localhost named[211]: NSTATS 929570318 929566719

Общий формат команды logger выглядит так:

logger -p -i message

Параметры этой команды выполняют следующие функции:

-p Определяет приоритет; в данном случае затрагивается только файл user.notice,

который всегда является используемым по умолчанию

-i Регистрирует ID процесса для каждого сообщения

26.5.1. Использование команды logger

В командной строке интерпретатора shell введите следующую команду:

$ logger -p notice "This is a test message. Please Ignore $LOGNAME"

Возможно, вам придется подождать пару минут, пока не отобразится информация о регистрации сообщения.

$ tail /var/adm/messages

Jun 17 10:36:49 acers6 dave: This is a test message. Please Ignore dave

Из приведенного примера видно, что регистрируется, пользователь, выполняющий регистрацию сообщения.

А теперь создадим небольшой сценарий, регистрирующий сообщение, в котором говорится о количестве пользователей в системе. Данный сценарий может использоваться для оценки интенсивности ежедневной загрузки системы. Для этого нужно просто запускать его из файла crontab примерно каждые 30 минут.

95
{"b":"273485","o":1}