Текст книги "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 на самом деле может предполагать наличие управляющей последовательности
Ниже приводятся наиболее распространенные наименования команды 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=
где значения
Переменная 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. Нумерация параметров начинается с единицы и завершается девятью; каждый параметр, доступ к которому следует получить, предваряется знаком доллара $. Первый параметр, имеющий номер нуль, резервируется для представления действительного названия сценария; это значение может использоваться независимо от того, содержатся ли в сценарии параметры.