355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Дэвид Тейнсли » Linux и UNIX: программирование в shell. Руководство разработчика » Текст книги (страница 11)
Linux и UNIX: программирование в shell. Руководство разработчика
  • Текст добавлен: 15 октября 2016, 00:39

Текст книги "Linux и UNIX: программирование в shell. Руководство разработчика"


Автор книги: Дэвид Тейнсли



сообщить о нарушении

Текущая страница: 11 (всего у книги 25 страниц)

–noflsh -xcase

–tostop -echoprt echoctl echoke

Довольно часто при настройке терминала не работает клавиша [Backspace], т. е. при ее нажатии не происходит удаление символа. Данная команда stty сообщает, что в качестве клавиши [Backspace] используется комбинация клавиш ^?. Однако эта комбинация не действует. С помощью комбинации клавиш [Ctrl+H] можно вернуться на одну позицию и удалить предыдущий символ. Поэтому для устранения данной проблемы воспользуемся командой stty. Общий формат установки параметров команды stty в командной строке:

stty символ

Ниже показана установка управляющей последовательности ^H, соответствующей коду клавиши [Backspace]:

$ stty erase '^H'

При использовании приведенной выше команды stty в файле .profile могут возникнуть затруднения. Команда stty на самом деле может предполагать наличие управляющей последовательности . Для устранения этого недостатка необходимо во время работы в редакторе vi поступить следующим образом: нажмите клавишу [Ctrl] и одновременно с ней клавишу [V], затем отпустите клавишу [V] и нажмите клавишу [Н].

Ниже приводятся наиболее распространенные наименования команды stty.

Наименование

Клавиша

Значение

intr

^C

Завершение процесса

echo

Подключение режима отображения

-echo

Отключение режима отображения

eof

^D

Конец файла, выход из системы

kill

^Y

Удаление строки

start

^Q

Начало прокрутки текста на экране

Stop

^S

Завершение прокрутки текста на экране

Весьма полезен следующий параметр команды stty:

stty -g

Этот параметр позволяет сохранить результаты выполнения команды stty в удобочитаемом формате. Затем эти результаты можно назначить команде stty, как показано выше на примере листинга файла /etc/profile. Для этого достаточно разместить содержимое команды stty -g в соответствующей переменной, ввести необходимые изменения в команду stty, а по завершении передать эти изменения команде stty.

Этим приемом удобно воспользоваться, если при изменении параметров команды stty вы нечаянно нарушили нормальную работу терминала. В этом случае можно легко восстановить исходные параметры терминала. Ниже приведен пример сохранения и последующего восстановления текущих установок команды stty. В данном случае команда stty -echo применяется для отключения режима отображения, а в конце сценария восстанавливаются исходные параметры.

$ pg password

#!/bin/sh

#пароль

#отображение процесса восстановления среды

stty SAVEDSTTY=`stty -g`

stty -echo

echo "nGive me that password :c"

read PASSWD

echo "nyour password is $PASSWD

stty $SAVEDSTTY

$ sttypass

Give me that password : your password is bong

В Linux …

Чтобы сообщить Linux, что в строках предполагается применение управляющих символов, команду echo следует вводить как "echo -e".

SAVEDSTTY=`stty -g`

stty -echo

echo "nGive me that password :c"

read PASSWD

echo "nyour password ls $PASSWD"

stty $SAVEDSTTY

Команда stty позволяет настраивать терминал, принтеры или модемы, т. е. она весьма универсальна. Однако, применяя команду stty, будьте внимательны. Не следует изменять настройку ранее установленного параметра, поскольку это может привести к нарушению работоспособности системы.

13.4. Создание файла .logout

Одним из недостатков интерпретатора Bourne shell является отсутствие в нем файла .logout. Этот файл содержит команды, которые требуется выполнить непосредственно перед завершением сеанса работы в системе, т. е. до выполнения команды

exit.

Однако собственный файл .logout интерпретатора Bourne shell можно создать с помощью команды trap (более подробные сведения о команде trap и сигналах приведены далее в книге). Рассмотрим, как это делается. Отредактируйте свой файл .profile и разместите на последней строке приведенную ниже команду. Затем сохраните этот файл и выйдите из режима редактирования.

trap "$HOME/.logout" 0

Создайте файл .logout и введите в него любые команды, которые требуется выполнить. В этот файл можно включать сведения по своему усмотрению.

$ pg .logout

rm -f $HOME/*.log

rm -f $HOME/*.tmp

echo "Bye…bye $LOGNAME"

Файл .logout вызывается при выходе пользователя из системы. Когда пользователь выходит из среды интерпретатора shell, система посылает сигнал 0, который и означает выход из текущего интерпретатора shell. Прежде чем управление передается обратно интерпретатору shell, для продолжения процесса выхода из системы, упомянутый выше сигнал перехватывается командой trap. Эта команда находится в соответствующей строке файла .profile. Затем выполняется файл .logout.

13.5. Заключение

Каждый пользователь может настроить свой файл $HOME/.profile в соответствии с требуемыми задачами. В главе было показано, каким образом можно переопределять общесистемные параметры согласно своим предпочтениям. Существует большое количество способов настройки пользовательской рабочей среды. Можно указывать приветственные сообщения и вносить существенные изменения в параметры терминала.

ГЛАВА 14

Переменные среды и интерпретатора shell

Чтобы продуктивно работать с интерпретатором shell, нужно уметь управлять переменными этого интерпретатора. Переменными интерпретатора shell являются наименования, которым присваиваются значения. В качестве значений может выступать имя пути, имя файла или число. В любом случае интерпретатор shell воспринимает присвоенное значение как текстовую строку.

Существуют переменные двух типов – переменные интерпретатора (shell) и переменные среды. На самом деле имеется четыре типа переменных, но оставшиеся предназначены только для чтения. Эти переменные считаются специальными и применяются при передаче параметров в shell–сценарии.

В этой главе рассматриваются следующие темы:

   • переменные интерпретатора shell;

   • переменные среды;

   • подстановка переменных;

   • экспорт переменных;

   • специальные переменные;

   • передача информации в сценарии;

   • применение позиционных параметров в системных командах.

14.1. Понятие о переменных интерпретатора shell

Переменные позволяют выполнить настройку среды. Они содержат информацию, которая применяется определенным пользователем. Благодаря этому система получает более подробные сведения о пользователях. Кроме того, переменные используются для хранения констант. Рассмотрим, например, переменную под именем editor. Существует довольно много текстовых редакторов, но как выбрать наиболее подходящий из них? Присвойте имя нужного редактора переменной editor, и тогда именно этот редактор будет применяться, когда используется программа cron или другие приложения. Система обращается к значению переменной editor и применяет указанный редактор как заданный по умолчанию.

Для регистрации в системе sybase следует ввести команду:

$ isql -Udavet -Pabcd -Smethsys

где -S – имя сервера, с которым установлена связь. Переменная, содержащая имя сервера, называется dsquery. Имя сервера присваивается переменной dsquery. При регистрации в системе в случае, если имя сервера не указывается вместе с " – S", приложение обращается к переменной dsquery и использует значение этой переменной в качестве имени сервера. Для регистрации нужно ввести

$ isql -Odawet -Pabcd

Так функционирует большинство приложений.

14.2. Локальные переменные

Переменные интерпретатора shell могут использоваться сценариями в период функционирования интерпретатора shell. После завершения выполнения интерпретатора действие этих переменных прекращается. Например, локальная переменная имя_файла может иметь значение hops.doc. Это значение важно для пользователя только во время выполнения текущего интерпретатора команд; если запускается на выполнение другой процесс или происходит выход из среды интерпретатора команд, текущее значение локальной переменной не сохраняется. Переменные этого типа недоступны для других интерпретаторов shell или процессов, что имеет свои преимущества.

В табл. 14.1 представлены различные способы присваивания значений переменным.

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

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

$ имя_переменной=значение или ${иня_перемениой=значение}

Обратите внимание, что с обеих сторон знака – имеются пробелы. Если значение содержит пробел, заключите все в двойные кавычки. Для переменных интерпретатора shell можно использовать как строчные, так и прописные буквы.

Таблица 14,1. Различные способы присваивания значений переменным

Имя переменной = значение

Значение переменной присваивается переменной имя_переменной

Имя переменной + значение

Значение переменной присваивается переменной

имя переменной, если оно установлено

Имя_переменной:?значение

На экран выводится сообщение об ошибке, если не установлена переменная имя_переменной

Имя переменной? значение

На экран выводится сообщение о системной ошибке, если не установлена переменная имя_переменной

Имя_переменной:=значение

Значение переменной присваивается переменной имя_переменной, если она не установлена

Имя переменной: – значение

Как и выше, но значение переменной имя_переменной не присваивается; оно может быть получено подстановкой

14.2.1. Отображение значения переменной

Чтобы отобразить значение отдельной переменной, достаточно применить команду echo и предварить имя переменной знаком $. Рассмотрим несколько примеров.

$ GREAT_PICTURE="die hard"

$ echo ${GREAT_PICTURE}

die hard

$ DOLLAR=99

$ echo $(DOLLAR)

99

$ LAST_FILE=ZLPSO.txt

$ echo ${LAST_FILE}

ZLPSO.txt

Переменные можно также комбинировать. Ниже переменной error_msg присваивается сообщение об ошибке, в котором используется значение переменной среды LOGNAME.

$ ERROR_MSG="Sorry this file does not exist user $LOGNAME"

$ echo ${ERROR_MSG}

Sorry this file does not exist user dave

В приведенном выше примере интерпретатор shell сначала выводит текст, затем рассматривает переменную $LOGNAME и отображает ее значение.

14.2.2. Удаление значения переменной

Чтобы удалить значение переменной, достаточно применить команду unset: unset имя_переменной

$ PC=enterprise

$ echo ${РС}

enterprise

$ unset PC

$ echo ${PC)

$

14.2.3. Отображение значений всех переменных интерпретатора shell

Чтобы просмотреть значения всех переменных интерпретатора shell, достаточно воспользоваться командой set.

$ set

PWD=/root

SHELL=/bin/sh

SHLVL=1

TERM=vt100

UID=7

USER=dave

dollar=99

great_picture=die hard

last_file=ZLPSO.txt

Вывод команды set может быть довольно обширен; при его изучении можно заметить, что интерпретатор shell значительно облегчил работу в среде.

14.2.4. Объединение значений переменных

Чтобы объединить значения переменных, достаточно последовательно расположить переменные:

echo ${имя_переменной}${имя_переменной}. . ,

$ FIRST="Bruce "

$ SURNAME=Willis

$ echo ${FIRST}${SURNAME}

Bruce Willis

14.2.5. Проверка на наличие значения переменной (подстановка)

Допустим, что нужно проверить, была ли установлена либо инициализирована переменная. Если это не так, можно тут же воспользоваться другим значением. Формат используемой в этом случае команды будет следующий:

${переменная: – значение}

Если переменная установлена, она применяется. Если переменная не установлена, вместо нее используется значение, например:

$ COLOUR=blue

$ echo "The sky is ${COLOUR:=grey} today"

The sky is blue today

Переменная colour имеет значение blue. Когда команда echo выводит на экран значение переменной colour, выполняется проверка, была ли установлена переменная ранее. Если переменная установлена, используется это значение. Выполним сброс значения переменной и рассмотрим результат.

$ COLOUR=blue

$ unset COLOUR

$ echo "The sky is ${COLOUR:=grey} today"

The sky is grey today

В приведенном примере переменной не присваивается действительное значение; для присваивания значения следует применить формат:

${переменная:=значение}

Рассмотрим более полезный пример, в котором содержится запрос о времени создания платежной ведомости (payroll), а также относительно ее типа. Если в обоих случаях при указании времени и типа нажать клавишу [Enter], то значения этих переменных не будут установлены пользователем. В этом случае применяются новые значения, заданные по умолчанию (03:00 и Weekly). Затем значения передаются команде at, что свидетельствует о переносе выполнения задания на более поздний срок.

$ pg vartest

#!/bin/sh

# vartest

echo "what time do you wish to start the payroll [03:00]:"

read TIME

echo " process to start at ${TIME:=03:00} OK"

echo "Is it a monthly or weekly run [Weekly]:"

read RUN_TYPE

echo "Run type ls ${RUN_TYPE:=Keekly}"

at -f $RUN_TYPE $TIME

Ниже при выводе данных выбирается клавиша [Enter] в обоих случаях.

$ vartest

what time do you wish to start the payroll [03:00]:

process to start at 03:00 OK ls it a monthly or weekly run [Weekly]:

Run type is Weekly

warning: commands will be executed using /bin/sh job 15 at 1999-05-14 03:00

Можно также проверить, установлено ли значение переменной, и затем выйти из системы, получив сообщение об ошибке. В следующем примере проверяется, установлен ли параметр для файла переменной длины.

$ echo "The file is ${FILES:?}"

sh: files: parameter null or not set

Приведенное выше сообщение не слишком информативно, но пользователь может задать свое собственное сообщение.

$ echo "The file is $(FILES:?} sorry cannot locate the variable files")"

sh: files: sorry cannot locate the variable files

Чтобы проверить, содержит ли переменная значение (а если не содержит, возвратить пустую строку), примените следующую команду:

${переменная:+значение)

Для инициализации переменной значением пустой строки примените команду:

variable=""

$ DESTINATION=""

14.2.6. Применение переменных, содержащих аргументы системных команд

Переменные можно также использовать для хранения информации, применяемой впоследствии для замены аргументов в командах системы. В следующем примере переменные сохраняют информацию об имени файла, которая необходима для копирования файла. С помощью переменной SOURCE можно узнать путь к файлу passwd, а с помощью переменной DEST – получателя этого файла. Обе эти переменные применяются в команде ср.

$ SOURCE="/etc/passwd"

$ DEST="/tmp/passwd.bak"

$ cp ${SOURCE} ${DEST}

В примере ниже с помощью переменной device получаем путь к накопителю на магнитной ленте. Эти сведения используются затем в команде mt при перемотке ленты.

$ DEVICE="/dev/rmt/0n"

$ mt -f ${DEVICE} rewind

14.2.7. Как сделать переменную доступной только для чтения

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

имя_переменной=значение readonly имя_переменной

В примере ниже установлена переменная tape_dev, которая указывает путь к одному из ленточных устройств системы. Затем она становится доступной только для чтения. При попытке изменить значение возникает сообщение об ошибке.

$ TAPE_DEV="/dev/rmt/0n"

$ echo ${TAPE_DEV}

/dev/rmt/0n

$ readonly TAPE_DEV

$ TAPE_DEV="/dev/rmt/1n"

sh: TAPE_DEV: read‑only variable

Чтобы просмотреть все переменные, которые доступны только для чтения, примените команду readonly.

$ readonly

declare -r FILM="Crimson Tide"

declare -ri PPID="1"

declare -r TAPE_DEV="/dev/rmt/0n"

declare -ri UID="0"

14.3. Переменные среды

Переменные среды доступны для всех пользовательских процессов (часто их называют дочерними процессами?. Пользователь регистрируется в процессе, который именуется родительским. Другие процессы, вызываемые из интерпретатора shell, называются дочерними. Переменные интерпретатора shell доступны только при выполнении текущего интерпретатора команд. Переменные среды доступны для всех дочерних процессов. Этими процессами могут быть редакторы, сценарии, приложения.

Переменные среды можно устанавливать в командной строке. Однако эти значения не сохраняются после выхода из системы. Поэтому переменные среды удобно инициализировать в пользовательском файле .profile. Системный администратор

может установить некоторые переменные среды в файле /etc/profile. Поскольку переменные размещаются в профильных файлах, они инициализируются при регистрации в системе.

Обычно при обозначении переменных среды используются прописные буквы. Чтобы переменная была доступна всем процессам, достаточно применить команду export. Присваивание значений переменным среды проходит так же, как и в случае с переменными интерпретатора shell.

14.3.1. Присваивание значений переменным среды

Для присваивания значений переменным среды применяется команда:

VARIABLE_NAME=значение; export VARIABLE_NAME

Точка с запятой между двумя командами выступает в роли разделителя команд. К аналогичному результату можно прийти следующим образом:

VARIABLE_NAME = значение export VARIABLE_NAME

14.3.2. Отображение значений переменных среды

Отображение значений переменных среды выполняется так же, как и в случае с переменными интерпретатора shell. Ниже приведено несколько примеров.

$ CONSOLE=tty1; export CONSOLE

$ echo $CONSOLE

tty1

$ MYAPPS=/usr/local/application; export MYAPPS

$ echo $MYAPPS /usr/local/application

Чтобы просмотреть глобально определенные переменные среды, достаточно воспользоваться командой env.

$ env

HISTSIZE=1000

HOSTNAME=localhost.localdomain

LOGNAME=dave

MAIL=/var/spool/mail/root

TERM=vt100

HOSTTYPE=i386

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/XllR6/bin:/root/bin:

CONSOLE=tty1

HOME=/home/dave

ASD=sdf

SHELL=/bin/sh

P$1=$

USER=dave

14.3.3. Удаление значений переменных среды

Чтобы удалить значение переменной, следует применить команду unset.

$ unset MYAPPS $ echo $MYAPPS

$

14.3.4. Встроенные переменные интерпретатора shell

Интерпретатор Bourne shell располагает именами, которые зарезервированы для переменных среды. Эти названия переменных нельзя использовать иначе. Обычно они содержатся в файле /etc/profile. Однако так бывает не всегда, поэтому пользователь может самостоятельно устанавливать значения этих переменных. Ниже приводится перечень переменных, встроенных в интерпретатор shell.

Переменная CDPATH

Переменная определяет выбор альтернативных каталогов, поэтому содержит ряд имен путей, разделенных двоеточием. Эта переменная применяется совместно с командой cd. Если значение переменной CDPATH установлено на момент выполнения команды cd, оно используется для выбора нового рабочего каталога. Если нужный каталог найден, он становится новым рабочим каталогом. Ниже приводится соответствующий пример,

$ CDPATH=/home/dave/bin:/usr/local/apps; export CDPATH

Теперь, обратим внимание на следующую команду:

$ cd apps

Команда cd будет выполнять поиск среди каталогов, заданных с помощью переменной CDPATH. Если нужный каталог найден, именно он становится текущим рабочим каталогом.

Переменная EXINIT

При работе с редактором vi переменная EXINIT предоставляет опции для инициализации этого редактора. Например, для установки нумерации всех строк и шага табуляции, равного 10 пробелам, примените следующую команду:

$ EXINIT=='set nu tab=10'; export EXINIT

Переменная HOME

Каталог HOME обычно указывается в файле passwd, во втором поле от конца файла. Именно в этом каталоге хранятся все персональные файлы пользователя. Если переменная установлена, для перехода в каталог НОМЕ можно воспользоваться клавишей быстрого доступа, соответствующей команде cd.

$ HOME=/home/dave; export HOME

$ pwd

$ /usr/local

$ cd

$ pwd

$ /home/dave

Можно также применить команду:

$ cd $НОНЕ

Переменная IFS

Переменная ifs применяется интерпретатором команд в качестве заданного по умолчанию разделителя полей. Внутренний разделитель полей может устанавливаться произвольным образом. По умолчанию разделителем полей служит пробел, символ новой строки или символ табуляции. Переменную ifs удобно использовать при разделении полей в файлах или переменных. Путь, включающий множество каталогов, более удобен для просмотра, если назначить переменной ifs двоеточие и вывести на экран значение переменной path.

$ export IFS=:

$ echo $PATH

/sbin /bin /usr/sbin /usr/bin /usr/X11R6/bin /root/bin

Чтобы вернуться к исходным установкам, достаточно применить следующую команду:

$ IFS=; export IFS

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

Переменная LOGNAME

Переменная содержит регистрационное имя пользователя. Значение этой переменной устанавливается по умолчанию. Если этого не случилось, значение можно присвоить с помощью команды

$ LOGNAME=`whoami` ; export LOGNAME

$ echo $LOGNAME

dave

Переменная MAIL

Переменная mail хранит имя пути доступа и имя файла для вашего почтового ящика. По умолчанию ее значение /var/spool/mail/<регистрационное имя>. Интерпретатор shell периодически проверяет почтовый ящик на предмет наличия новых сообщений. Если пользователь получает электронное сообщение, он узнает об этом из командной строки. Если к почтовому ящику имеется другой путь, установите его с помощью переменной mail:

$ MAIL=/usr/mail/dave; export MAIL

Переменная MAILCHECK

Значение переменной mailcheck задается по умолчанию таким образом, чтобы наличие новой электронной почты проверялось каждые 60 секунд. Если электронную почту следует запрашивать реже, допустим каждые 2 минуты, примените команду:

$ MAILCHECK=120; export MAILCHECK

Переменная MAILPATH

Применяйте переменную mailpath, если вы располагаете более чем одним почтовым ящиком. При установке значения этой переменной перекрывается значение переменной mail:

$ MAILPATH=/var/apool/dave:/var/epool/admin; export MAILPATH

В данном примере переменная mail проверяет два почтовых ящика – dave и admin.

Переменная PATH

Переменная path хранит сведения о каталогах, где находятся выполняемые команды или сценарии. Важно, чтобы эта последовательность указывалась правильно, поскольку при обращении к этой переменной существенно сокращается время выполнения команды или сценария. Например, если в каком‑либо каталоге нет заданной команды, то не следует его просматривать. В общем случае лучше сначала задать каталог НОМЕ, за которым будет следовать перечень каталогов. Перечень включает каталоги, отсортированные по частоте применения. Сначала указываются наиболее часто применяемые каталоги, а затем те из них, которые применяются реже всего. Если нужно найти текущий рабочий каталог, то независимо от места его нахождения используйте точку. Каждый каталог отделяется двоеточием. Рассмотрим пример.

$ PATH=$HOME/bin: . :/bin:/usr/bin; export PATH

Согласно приведенному примеру, сначала производится поиск в каталоге НОМЕ/ bin, затем – в текущем каталоге, каталоге /bin и в каталоге /usr/bin.

Значение переменной path для системных каталогов задается в файле /etc/profile. Чтобы воспользоваться переменной path, определяя собственный вариант переменной path, достаточно в конце указать точку с запятой (;}.

$ PATH=$PATH:/$HOME/bin:. ; export PATH

В данном случае используется переменная path, определенная в файле /etc/profile, а также указан каталог $HOME/bin и текущий каталог. В общем случае нежелательно использовать текущий каталог при записи первого пути поиска. Если допустить подобное, то текущий каталог станет доступным и для других пользователей.

Переменная P$1

Основная командная строка включает символ приглашения интерпретатора shell. По умолчанию для основной командной строки используется символ #, а для любой другой командной строки применяется символ $. В командной строке можно использовать любые символы. Ниже приводятся два примера.

$ P$1="star trek:"; export P$1

star trek:

$ P$1=" ->" ; export P$1

–>

Переменная PS2

Значение этой переменной задает вид вторичной командной строки. По умолчанию этот тип командной строки определяется символом >. Подобная командная

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

$ PS2="@:"; export PS2

$ for loop in *

@:do

@:echo $LOOP

Переменная SHELL

Переменная shell включает сведения об интерпретаторе shell, заданном по умолчанию. Интерпретатор команд обычно указан в файле /etc/passwd. Это значение нельзя отменить, даже если приходится использовать другой интерпретатор команд.

$ echo $SHELL

/bin/sh

Переменная TERMINFO

Переменная, определяющая инициализацию терминала, хранит сведения о местонахождении файлов конфигурации терминала. Обычно эти файлы находятся либо в каталоге /usr/lib/terminfo, либо в каталоге /usr/share/terminfo.

$ TERMIHFO=/uer/lib/terminfo; export TERMIHFO

Переменная TERM

Переменная term представляет тип терминала. Эта переменная служит для указания типа управляющих последовательностей, необходимых для правильного функционирования экрана и клавиатуры. Самыми распространенными типами терминалов являются vt100, vt220, vt220-8, wyse и т. д.

$ TERM=vt100; export TERM

Переменная TZ

Эта переменная позволяет определить часовой пояс. Значение переменной TZ устанавливает администратор. Если для интерпретатора shell потребуется изменить значение этой переменной, обратите внимание на следующие примеры:

$ echo $TZ

GMT2EDT

В данном случае возвращается значение, которое свидетельствует о том, что отсчет времени происходит по Гринвичу (Greenwich Mean Time) (временное смещение относительно GMT составляет 0 часов) в диапазоне летнего времени (Eastern Daylight Saving).

14.3.5. Другие переменные среды

Для переменных среды резервируются и другие названия; эти имена используются в иных приложениях. Ниже приводятся наиболее распространенные имена. Не забывайте, что значения для этих переменных не устанавливаются; их задает сам пользователь.

Переменная EDITOR

Присвойте этой переменной название предпочитаемого вами текстового редактора.

$ EDITOR=vi; export EDITOR

Переменная PWD

Эта переменная представляет имя пути доступа для текущего каталога. Обычно

значение переменной изменяется всякий раз при выполнении команды cd.

Переменная PAGER

Данная переменная хранит сведения о командах программы постраничной разбивки. К подобным командам можно отнести, например, pg, more. Система проверяет значение этой переменной, когда пользователь выполняет просмотр страниц man.

$ PAGER='pg -f -p%d'; export PAGER

Переменная MANPATH

Представляет каталоги, которые включают страницы справочной программы man. Имя каждого каталога отделяется двоеточием.

$ MANPATH=/usr/apps/man:/usr/local/man; export MANPATH

Переменная LPDEST или переменная PRINTER

Эта переменная представляет имя принтера, заданного по умолчанию. При выводе на печать сохраняется имя принтера, заданное пользователем.

$ LPDEST=hp3si_systems

14.3.6. Применение команды set

Экспорт переменных среды можно задать при установке этих переменных в файле $HOME .profile. Воспользуйтесь командой set с параметром " -a" в виде "set -а". Это означает, что выполняется экспорт всех переменных. Не применяйте этот метод при работе с файлом /etc/profile. Данный метод применим только при работе с файлом $HOME/.profile.

$ pg .profile

#.profile

set -a

MAIL=/usr/mail/${LOGNAME:?}

PATH=$PATH:$HOME:bin

#

EDITOR=vi

TERM vt220

ADMIN=/usr/adm

P$1="`hostname` >>"

14.3.7. Экспорт переменных в дочерние процессы

Для тех, кто только начинает работать с интерпретатором shell, существенное затруднение представляет экспорт переменных в дочерние процессы. Теперь, после рассмотрения основных принципов работы с переменными среды, перейдем к

выполнению практических задач. Ниже приводится пример, сценария, который вызывает другой сценарий. Вызываемый сценарий фактически и является дочерним процессом.

Рассматриваемый листинг включает два небольших сценария под именами father и child. Сценарий father задает переменную с именем film, значение которой "A Few Good Men". Эта переменная отображается на экране, затем вызывается другой сценарий под названием child. Данный сценарий отображает переменную film из первого сценария. Перед отображением на экране значением переменной film становится "Die Hard". Затем управление передается назад, сценарию father, и значение переменной снова выводится на экран.

$ pg father

#!/bin/sh

# сценарий father.

echo "this ls the father"

FILM="A Few Good Men"

echo "I like the film: $FILM"

# вызов сценария child

child

echo "back to father"

echo "and the film ls :$FILM"

$ pg child

#!/bin/sh

# сценарий child

echo "called from father..! am the child"

echo "film name is :$FILM"

FILM="Die Hard"

echo "changing film to :$FILM"

Рассмотрим, что будет отображаться на экране в результате выполнения сценария.

$ father

this ls the father

I like the film :A Few Good Men

called from father… i am the child

film name is :

changing film to :Die Hard

back to father

and the film ls :A Few Good Men

Сценарий child не может возвратить переменную film, поскольку эта переменная не может быть экспортирована в сценарий father.

Теперь, если команду export добавить в сценарий father, сценарий child получит всю информацию о переменной film.

$ pg father

#!/bin/sh

# сценарий father.

echo "this ls the father"

FILM="A Few Good Men"

echo "I like the film :$FILM"

#вызов сценария child

#сначала экспортируйте переменную

export FILM

child

echo "back to father"

echo "and the film is :$FILM"

$ father2

this ls the father

I like the film :A Few Good Men

called from father… i am the child

film name ls :A Few Good Men

changing film to :Die Hard

back to father

and the film ls :A Few Good Men

После того как команда export включена в состав сценария, можно выполнить произвольное число процессов. И всем этим процессам известно о наличии переменной FILM.

Нельзя выполнять экспорт переменных из дочерних процессов в родительский процесс; однако с помощью изменения направления этого можно добиться.

14.4. Позиционные параметры командной строки

Как указывалось в начале главы, существуют переменные четырех типов. Имеются переменные интерпретатора команд, переменные среды, а также переменные двух других типов, которые являются специальными, поскольку они предназначены только для чтения. Существуют позиционные и специальные параметры. Рассмотрим позиционные параметры.

Если информация передается shell–сценарию, с помощью позиционных параметров можно получить доступ к ней. Каждый параметр передает сценарию заданное количество ссылок. Можно передавать произвольное число аргументов, но доступными являются только первые девять из них. Это ограничение преодолевается путем использования команды shift. Далее в книге будет показано, как работает команда shift. Нумерация параметров начинается с единицы и завершается девятью; каждый параметр, доступ к которому следует получить, предваряется знаком доллара $. Первый параметр, имеющий номер нуль, резервируется для представления действительного названия сценария; это значение может использоваться независимо от того, содержатся ли в сценарии параметры.


    Ваша оценка произведения:

Популярные книги за неделю