Skip to content

Окружение

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

Понятие окружения

Чтобы понять, что такое окружение, нужно немного забежать вперед и разобраться в базовых терминах многозадачности Linux. В основе многозадачности лежит понятие "процесс". Процесс — это нечто, совершающее в системе какие-либо действия. Обычно это запущенная работающая программа. Один процесс может инициировать (породить) другой. В таком случае породивший процесс называют родителем или родительским процессом, а порожденный — потомком или дочерним процессом. Все процессы в системе — элементы одной иерархии, называемой деревом npoifeccoe. На вершине этой иерархии находится процесс ink. Это единственный процесс, не имеющий родителя. Каждый раз, когда вы запускаете в командной строке какую-нибудь программу, например Is, в системе рождается новый процесс, для которого оболочка является родителем. Если, например, программа запускается из меню KDE, то в системе рождается процесс с родителем kdeinit и т. д.

Бытует мнение, что родителем процесса init является ядро Linux. He имеет смысла в очередной раз поднимать философский вопрос о курице и яйце. Для нас важно лишь то, что init всегда стоит на вершине иерархии процессов.

Окружение (environment) — это набор специфичных для конкретного пользователя пар переменная=значение. Каждый процесс располагает и свободно распоряжается своей копией окружения, которую он получает от родителя. Таким образом, если процесс сначала модифицирует свое окружение, а потом породит новый процесс, то потомок получит копию уже измененного окружения.

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

$ env

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

  • ? user — имя пользователя;
  • П номе — домашний каталог;
  • ? path — список каталогов, в которых осуществляется поиск исполняемых файлов программ;
  • ? shell — используемая командная оболочка;
  • ? pwd — текущий каталог.

Следующий шаблон позволяет посмотреть значение конкретной переменной:

$ echo $VARIABLE

Здесь variable — это имя переменной. Вообще говоря, оболочка вместо записи $variable всегда подставляет значение соответствующей переменной окружения. Рассмотрим пример:

$  touch $USER

Вместо $user здесь подставляется значение переменной. Такая команда создаст пустой файл, присвоив ему имя текущего пользователя.

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

$ MYVAR=Hello
$ echo $MYVAR' $ env | grep MYVAR $

Первой командой создается и инициализируется локальная переменная оболочки myvar. Следующая команда выводит значение этой переменной. Третья команда ищет переменную myvar среди окружения программы env (точная копия окружения оболочки). Но поскольку myvar не является переменной окружения, то последняя команда ничего не выводит.

Как видно из этого примера, локальные переменные "работают" только на уровне оболочки. Не являясь частью окружения, они не могут наследоваться дочерними процессами. Поэтому программа env не нашла переменную myvar. Но иногда требуется включить (экспортировать) локальную переменную в окружение. Для этого в оболочке bash есть внутренняя (не являющаяся отдельной программой) команда export:

$ export MYVAR
$ env | grep MYVAR
MYVAR=Hello

Команду export можно также использовать для инициализации и экспорта переменной в один прием:

$ export MYVAR_NEW=Goodbye $ env  |  grep MYVAR_jNEW
MYVAR_NEW=Goodbye

Важно понимать, что полученные переменные myvar и myvar_new существуют только в текущем окружении процесса оболочки и ее потомков. Очевидно, что после перезагрузки эти переменные "исчезнут", если их, например, не объявить в файле инициализации bash. Даже такая жизненно важная переменная как path не появляется в окружении оболочки сама собой: строка для ее инициализации обычно находится в файле /etc/profile.

Исключить переменную из окружения оболочки позволяет команда export -n. При этом остается локальная переменная. Когда же надо удалить переменную отовсюду, вызывают команду unset:

$ env | grep -i myvar
MYVAR_NEW=Goodbye
MYVAR=Hello
$ export -n MYVAR
$ env | grep MYVAR
MYVAR_NEW=Goodbye
$ echo $MYVAR
Hello
$ unset MYVAR_NEW
$ env | grep MYVAR
$ echo -n $MYVAR_NEW
$

Важно понимать, что export, export -n и unset — это не отдельные программы, а внутренние команды bash. Оболочки ksh (KornShell) и zsh (Z shell), например, не поддерживают опцию -п команды export. Оболочки семейства C-Shell (csh, tcsh) работают с окружением совсем другими командами setenv и unsetenv.

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top