Взаимодействие процессов посредством окружения

С другой стороны, переменная окружения - удобное и простое средство управления системой и утилитами. Не один только командный интерпретатор, но и любой процесс в системе имеет так называемое окружение (environment), которое состоит из пар "имя=значение". Окружение создает система, копируя окружение процесса-родителя. Потомок волен делать со своей копией что угодно: изменять значения переменных, заводить новые, удалять и т. п., на окружении родителя это никак не отразится. С переменными окружения можно передавать важную информацию. Отличие от параметров командной строки заключается в том, что переменную достаточно изменить или задать один раз, и пока она изменена, по-другому будет работать и чувствительная к ней утилита. С точки зрения shell его собственные переменные и есть переменные окружения.

Например, утилита ls использует переменную окружения COLUMNS, в которой хранится наибольшая допустимая ширина текста. Можно обычным присваиванием изменить значение этой переменной, и ls примет его к сведению:

$ echo $COLUMNS$ ls Makefile myscript uzor.cfhs-2.2-source.tar.gz o.ps$ COLUMNS=60$ lsMakefile o.psfhs-2.2-source.tar.gz uzor.cmyscript

Многие программы используют переменную EDITOR, содержащую имя текстового редактора: если понадобится что-нибудь редактировать, они запустят именно его. Переменная HOME содержит путь к вашему домашнему каталогу, в TERM хранится тип терминала, в LOGNAME - входное имя пользователя. Переменная PATH используется самим shell для поиска утилиты, если имя команды не совпадает с именами ни одной из встроенных команд. В PATH перечислены каталоги, в которых shell будет утилиту искать. Кстати сказать, именно потому, что в переменной PATH обычно нет текущего каталога (путь "." не включен в список), в одном из приведенных выше примеров мы были вынуждены явно указывать его в виде./myscript. Помещать "." в PATHнебезопасно: кто может знать, не окажется ли в текущем каталоге исполняемый файл с именем, скажем, ls, и кто может знать, что на самом деле этот файл будет делать при запуске?

Список определяемых переменных окружения велик, его выдает команда set. Желающих узнать, какими переменными окружения пользуется та или иная утилита, мы отсылаем к ее руководству, раздел ENVIRONMENT VARIABLES.

Сам shell пользуется многими переменными окружения. Например, строка-подсказка (то, при виде чего пользователь захочет ввести очередную команду в командной строке) хранится в переменной PS1 (Если есть PS1, то должно быть PS2, а может, и PS3, иPS4. Для чего они? RTFM!). Поначалу в этой переменной хранилась строка " $ " для обычного пользователя и " # " для суперпользователя. Потом решили использовать PS1 для вывода кое-какой полезной информации: имени компьютера, имени пользователя, даты входа в систему или прочей относительно статической информации. Это просто, достаточно написать что-то вроде:

$ echo $PS1$$ PS1="`logname`@`hostname`> "george@book.altlinux.ru> george@book.altlinux.ru>

Однако статическая информация - не самое полезное в работе. Гораздо интереснее держать в PS1, скажем, путь к текущему каталогу или точное время. Сменился текущий каталог - изменилась PS1. Сам shell изменять PS1 не будет, значит, надо его доработать. Первый способ доработки - научить его выполнять определенную последовательность команд перед тем, как выводить очередную подсказку или при смене текущего каталога (так поступили разработчики tcsh: там можно задать специальные функции precmd, cwdcmd и некоторые другие). В эту последовательность команд можно вставить команды изменения PS1. Другой вариант - считать некоторые последовательности символов в PS1 специальными и при выводе подсказки заменять их соответствующими значениями - путем, временем и т. п. Вот, например, как это делается в bash:

bash$ pwd/usr/share/docbash$ PS1="[\A]\u@\h:\w> "[17:30]george@book:/usr/share/doc> [17:30]george@book:/usr/share/doc>

Один сценарий можно запустить из другого точно так же, как и из командной строки, и так же, как любую утилиту UNIX. Выполняться этот сценарий будет тоже стандартно: система подберет и запустит для него соответствующий интерпретатор, передаст ему строку вызова в качестве параметров и т. д. Понятно, что если в нем изменить какую-нибудь переменную окружения, родительский процесс этого не заметит. Больше того, изо всех переменных, определенных в родительском shell в окружение дочернего процесса, попадут только проэкспортированные командой export и те, что достались самому shell с окружением (от его родителя, например, от init). Остальные переменные будут считаться локальными и никуда не перейдут. Если мы хотим вызвать из одного сценария другой так, чтобы этот другой выполнялся той же копией интерпретатора (а значит, сохранились бы все изменения в окружении), надо использовать специальную команду ".":

$ cat changeA A="NewA"$ A=""$. changeA $ echo $A NewA

10.Переменные в shell их типы и операции с ними


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: