Перейти к содержанию

2.4 Работа с переменными окружения (Working with Environment Variables)

При каждом запуске оболочки bash ряд переменных используется для задания критически важных параметров, необходимых для её работы. Поскольку эти переменные определяют среду оболочки, они называются переменными окружения (environment variables). В данной части главы мы подробно рассмотрим переменные окружения. В частности, будут затронуты следующие темы:

  • что такое переменные окружения;
  • управление переменными окружения;
  • создание пользовательских переменных.

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

Что такое переменные окружения?

Чтобы понять, что такое переменная окружения, необходимо сначала разобраться в понятии переменной как таковой. Лучше всего описать переменную через образ ведра, в которое можно насыпать или налить что угодно. У этого ведра есть имя, например «MyStuff», и его можно наполнить песком, камнями, водой, почвой и так далее. Если ведро уже заполнено каким-либо содержимым, скажем песком, то перед тем как наполнить его другим веществом, например камнями, необходимо его опустошить.

Именно так работает переменная в системе Linux. Это область в оперативной памяти, зарезервированная для хранения произвольных значений. По сути, это «ведро» в памяти. Так же как перед тем, как налить новое вещество, реальное ведро нужно освободить, — прежде чем присвоить переменной новое значение, её необходимо очистить. В системе Linux можно определять и использовать переменные двух типов:

  • пользовательские переменные;
  • переменные окружения.

Пользовательские переменные (user-defined variables) — это именно то, чем кажутся. Это «вёдра» в памяти, которые вы создаёте самостоятельно. Им можно присваивать любые имена и помещать в них любые значения. Пользовательские переменные особенно полезны при работе со сценариями оболочки, о которых речь пойдёт в главе 14.

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

Например, предположим, что вы вводите команду cd ~ в приглашении командной строки. Эта команда переключает текущий каталог оболочки на домашний каталог пользователя — вне зависимости от того, какой пользователь вошёл в систему в данный момент.

Предположим, я вошёл в систему Linux под учётной записью rtracy. По умолчанию мой домашний каталог — /home/rtracy. Если я введу команду cd ~, находясь в системе под именем rtracy, текущий каталог изменится на /home/rtracy. Обратите внимание: нигде в команде я не указывал путь /home/rtracy. Команда cd сама «знала», что ~ указывает на /home/rtracy. Однако если бы я вошёл в систему под именем ksanders, та же команда cd ~ перевела бы меня не в /home/rtracy, а в /home/ksanders.

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

rtracy@openSUSE:~> echo $HOME
/home/rtracy

Поскольку в систему вошёл пользователь rtracy, переменная HOME установлена в /home/rtracy. Если же в систему войдёт пользователь ksanders, система изменит значение переменной окружения HOME на /home/ksanders, что показано далее:

ksanders@openSUSE:~> echo $HOME
/home/ksanders

Система Linux определяет ряд переменных окружения, подобных только что рассмотренной HOME. Наиболее важные переменные окружения, используемые в большинстве дистрибутивов Linux, перечислены в табл. 2-5.

Переменная окружения Хранит Значение по умолчанию
BASH и SHELL Полный путь к исполняемому файлу оболочки /bin/bash
CPU Тип процессора, установленного в системе Зависит от системы. Компьютер с процессором Intel Pentium IV имел бы значение i686.
DISPLAY Адресат вывода графической среды X Window 0.0 (локальная видеокарта и монитор)
ENV Имя файла, который bash читает для настройки своей среды /etc/bash.bashrc
EUID Идентификатор пользователя (UID) текущего пользователя Числовой UID текущего пользователя
HISTFILE Путь к файлу истории команд bash ~/.bash_history
HISTSIZE Количество команд, сохраняемых в файле истории 1000
HOME Путь к домашнему каталогу текущего пользователя Домашний каталог текущего пользователя
HOST и HOSTNAME Имя хоста системы Имя хоста, назначенное при установке системы
LOGNAME Имя текущего пользователя Имя текущего пользователя
MAIL Путь к файлу почтового ящика текущего пользователя /var/spool/mail/имя_пользователя или /var/mail/имя_пользователя
MANPATH Путь к программе man системы Зависит от дистрибутива
OLDPWD Путь к предыдущему текущему каталогу Зависит от того, каким был предыдущий каталог
OSTYPE Тип используемой операционной системы Linux
PATH Список каталогов, в которых выполняется поиск при запуске команды из приглашения командной строки Зависит от дистрибутива
PS1 Символы, используемые для формирования приглашения командной строки Зависит от дистрибутива
PWD Путь к текущему рабочему каталогу Зависит от того, каков текущий каталог

Табл. 2-5. Наиболее часто используемые переменные окружения.

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

Управление переменными окружения

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

  • просмотр переменных и их значений;
  • присвоение значения переменной;
  • обеспечение постоянства переменных.

Просмотр переменных и их значений

Если вам нужно узнать значение, присвоенное той или иной переменной в системе, можно воспользоваться различными командами приглашения командной строки. Для просмотра значения одной переменной служит команда echo. Синтаксис: echo $переменная. Например, чтобы просмотреть значение переменной PATH, введите echo $PATH в приглашении командной строки, как показано далее:

ksanders@openSUSE:~> echo $PATH
/usr/lib/mpi/gcc/openmpi/bin:/home/rtracy/bin:/usr/local/bin:/usr/bin:/bin:/
usr/bin/X11:/usr/X11R6/bin:/usr/games

Как видите, содержимое переменной PATH выводится на экран. Обратите внимание: при использовании команды echo перед именем переменной необходимо ставить символ $. Это очень важно. Символ $ указывает команде echo, что следующий за ним текст — не строковый литерал, а имя переменной, и что echo должна получить значение этой переменной и отобразить его на экране. Если опустить символ $, команда echo выведет имя переменной как есть. Например, если ввести echo PATH в приглашении командной строки, команда echo просто выведет «PATH» — потому что она не знает, что «PATH» — это имя переменной. echo считает, что вы хотите вывести текстовую строку «PATH». Поэтому не забывайте ставить символ $ при использовании echo с переменными!

Как вы только что убедились, команда echo отлично подходит для отображения содержимого переменной на экране. Однако с её помощью можно вывести только те переменные, имена которых вы указываете. Значит, вам нужно знать имена переменных, которые хотите просмотреть. А что если точное имя переменной неизвестно? Что если требуется просмотреть все переменные сразу?

В таких случаях можно воспользоваться другими командами оболочки для просмотра переменных и их значений. Одна из них — команда set. Если ввести set в приглашении командной строки, на экран выводятся все переменные — как переменные окружения, так и пользовательские. Поскольку вывод set может быть очень длинным, следует применять set | more для постраничного просмотра. (Перенаправление рассматривается далее в этой главе.) Например, на рис. 2-9 показан результат выполнения команды set | more в приглашении командной строки.

Рис. 2-9. Вывод переменных окружения с помощью команды set.

Рис. 2-9. Использование set для просмотра переменных окружения и их значений.

Как видите, каждая переменная отображается вместе со своим значением. Помимо set, для просмотра переменных окружения системы можно использовать команду env. Как и в случае с set, вывод env может быть весьма объёмным, поэтому рекомендуется добавлять | more для постраничного отображения. На рис. 2-10 показан вывод команды env.

Рис. 2-10. Вывод переменных окружения с помощью команды env.

Рис. 2-10. Использование env для просмотра переменных окружения и их значений.

Как и set, команда env выводит каждую переменную и её текущее значение. Однако обратите внимание: env не сортирует переменные. Команда set выводит переменные в алфавитном порядке — что, несомненно, удобнее!

Таким образом, все три команды — echo, set и env — позволяют просматривать переменные и их значения. Но что если нужно изменить значение переменной? Рассмотрим это далее.

Присвоение значения переменной

Как уже отмечалось, в большинстве случаев значения переменных окружения, установленные системой, работают корректно. Более того, многие переменные окружения не следует изменять! Например, изменение значения переменной HOSTNAME может нарушить работу многих служб системы.

Тем не менее иногда возникает необходимость изменить значение переменной окружения. Например, может потребоваться добавить дополнительный каталог в конец переменной PATH — это удобный способ упростить жизнь пользователям (и себе тоже). Кроме того, может понадобиться изменить переменную DISPLAY, чтобы настроить передачу вывода X Window System на удалённый компьютер. Или же потребуется изменить внешний вид приглашения командной строки, чтобы оно отображало иные данные.

Для всех этих задач необходимо изменить значение переменной окружения. Это сделать достаточно просто: введите переменная=значение в приглашении командной строки. Например, предположим, что вы установили приложение myapp в каталоге /var/opt/mydb. Этого пути ещё нет в переменной PATH, и вы хотите добавить его, чтобы не вводить полный путь при каждом запуске программы. Для этого введите PATH=$PATH:/var/opt/mydb в приглашении командной строки.

Обратите внимание: в присвоении переменной указывается $PATH. Это позволяет включить текущее значение переменной PATH в новое. Затем к существующему списку путей добавляется :/var/opt/mydb. Если не указать $PATH при переназначении, текущие каталоги в переменной PATH будут удалены и заменены только новым указанным путём — это приведёт к серьёзным проблемам в работе системы!

Примечание

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

Однако нам осталось выполнить ещё одно действие. Новое значение переменной PATH, включающее дополнительный каталог, применяется только к текущему сеансу оболочки. Если открыть другой сеанс терминала, сделанное изменение не будет применено.

Чтобы изменение распространилось на все оболочки, необходимо экспортировать новое значение переменной. Для этого введите export переменная в приглашении командной строки. В нашем примере нужно ввести export PATH. После этого новое значение PATH станет доступным для всех остальных оболочек, включая дочерние оболочки, порождённые текущей.

Обеспечение постоянства переменных

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

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

Для этого можно добавить команду присвоения нового значения переменной PATH (включающего /var/opt/mydb) и команду экспорта PATH в один из следующих файлов конфигурации bash:

  • ~/.bashrc
  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

Совет

Добавление команд в глобальный файл конфигурации bash, такой как /etc/profile, применит изменение ко всем пользователям. Если требуется применить изменение только к одному пользователю, следует использовать соответствующий файл конфигурации bash в домашнем каталоге этого пользователя.

Вам нужно определить, какие файлы использует ваш конкретный дистрибутив. Например, для пользователя ksanders можно добавить следующие команды в файл ~/.bash_profile его домашнего каталога:

PATH=$PATH:$HOME/bin:/var/opt/mydb
export PATH

Теперь при каждой загрузке системы и входе пользователя ksanders путь /var/opt/mydb будет автоматически добавляться в его переменную окружения PATH. Поскольку команды добавлены в файл ~/.bash_profile домашнего каталога пользователя ksanders, они не будут влиять на переменную PATH других пользователей.

Потренируемся работать с переменными окружения в следующем упражнении.

Упражнение 2-7. Работа с переменными окружения

В этом упражнении вы потренируетесь работать с переменными окружения в оболочке bash. Упражнение можно выполнить на виртуальной машине, прилагаемой к книге. Для получения настроенной среды загрузите снимок состояния (snapshot) 2-1.

VIDEO Посмотрите видео к упражнению 2-7 с демонстрацией выполнения этого задания.

Выполните следующие действия:

  1. Если вы ещё не сделали этого, загрузите систему Linux и войдите в неё.
  2. При необходимости откройте сеанс терминала.
  3. Переключитесь на учётную запись суперпользователя root, введя su – и указав пароль root.
  4. В приглашении командной строки просмотрите значения следующих переменных окружения, введя приведённые ниже команды:
    echo $PWD
    echo $HOME
    echo $EUID
    echo $PATH
    echo $PS1
    
  5. Измените приглашение командной строки так, чтобы в нём отображались: имя текущего пользователя, имя хоста Linux, текущее время, полный путь к текущему рабочему каталогу и двоеточие. Для этого выполните следующее: a. В приглашении командной строки введите PS1="[\u@\h \t \w]:". Приглашение должно немедленно измениться. b. В приглашении командной строки введите export PS1. c. В приглашении командной строки введите ls ~ –a. Какой файл вашего дистрибутива нужно отредактировать, чтобы изменения переменной окружения PS1 стали постоянными?

Теперь обсудим создание пользовательских переменных.

Создание пользовательской переменной

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

Например, предположим, что нужно создать переменную с именем ME и присвоить ей значение «Robb Tracy». Для этого введите ME="Robb Tracy" в приглашении командной строки. После этого переменная ME будет добавлена в систему и получит значение Robb Tracy. Просмотреть значение переменной ME можно с помощью команды echo, как показано ниже:

rtracy@openSUSE:~> ME="Robb Tracy"
rtracy@openSUSE:~> echo $ME
Robb Tracy
rtracy@openSUSE:~>

Как и переменная окружения, пользовательская переменная доступна только текущему экземпляру оболочки. Чтобы сделать её доступной для других оболочек, включая дочерние, её необходимо экспортировать командой export. В данном примере для этого нужно ввести export ME в приглашении командной строки. Помимо echo, для просмотра пользовательских переменных можно использовать set или env — так же как и для переменных окружения.

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

  • Имена переменных могут содержать буквы и цифры, но не могут начинаться с цифры.
  • Имена переменных могут содержать дефисы (-) или символы подчёркивания (_).
  • Хотя это и не обязательно, рекомендуется использовать буквы верхнего регистра при именовании переменных. Обратите внимание: если ввести set или env, все системные переменные окружения используют имена в верхнем регистре. Следуйте той же практике.

Следующая тема, которую нам нужно рассмотреть, — это псевдонимы. Обсудим принцип их работы.