Переменные среды и оболочки

14.04.2018

Теги: BashCLIexportLinuxsetunsetОкружениеПеременная

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

Среда содержит пары вида «ключ-значение». Несколько значений, как правило, разделяются символом двоеточия (:). Каждая пара, в целом, выглядит примерно так:

КЛЮЧ=значение1:значение2:…
Если же значение содержит пробелы, нужно использовать кавычки:
КЛЮЧ='значение с пробелами'

В данном случае под ключом подразумеваются переменные одного из двух существующих видов: переменные среды или переменные оболочки.

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

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

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

Вывод переменных оболочки и среды

Для просмотра списка всех переменных среды, используются команды env или printenv. По умолчанию они выведут точно такой же результат:

$ env
SHELL=/bin/bash
USER=evgeniy
PWD=/home/evgeniy
LANG=ru_RU.UTF-8
..........

Данные команды отличаются только несколькими индивидуальными функциями. К примеру, printenv может запрашивать значения отдельных переменных:

$ printenv SHELL
/bin/bash

Команда env позволяет изменять среду, в которой запущены программы, передавая набор определений переменных в команду, примерно так:

$ env VAR='some value' command options

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

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

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

Этот список содержит огромное количество дополнительной информации, которая нам в данный момент не интересна (к примеру, некоторые функции bash).

Основные переменные среды и оболочки

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

  • SHELL: описывает оболочку, которая интерпретирует введенные команды. В большинстве случаев по умолчанию установлена bash, но это значение можно изменить в случае необходимости.
  • TERM: указывает вид терминала, эмулируемого при запуске оболочки. В зависимости от операционных требований можно эмулировать разные аппаратные терминалы.
  • USER: текущий пользователь.
  • PWD: текущий рабочий каталог.
  • OLDPWD: предыдущий рабочий каталог. Оболочка хранит его на случай запуска команды cd -.
  • LS_COLORS: определяет цветовые коды, которые используются для цветного вывода результата команды ls. Такой вывод помогает пользователю быстрее прочесть результат команды (например, быстро различить типы файлов).
  • MAIL: путь к текущему почтовому ящику пользователя.
  • PATH: список каталогов, к которым обращается система при выполнении команд. Когда пользователь запускает команду, система проверяет эти каталоги в указанном порядке в поисках исполняемого файла.
  • LANG: текущие настройки языка и локализации, в том числе кодировка символов.
  • HOME: домашний каталог текущего пользователя.
  • _: последняя выполненная команда.

Ознакомившись со списком переменных среды, посмотрим на список переменных оболочки:

  • BASHOPTS: список опций, использованных при выполнении bash. Это можно применять для того, чтоб проверить, работает ли среда должным образом.
  • BASH_VERSION: запущенная версия bash в удобочитаемой форме.
  • BASH_VERSINFO: версия bash в машиночитаемом формате.
  • COLUMNS: определяет ширину вывода в столбцах.
  • DIRSTACK: стек каталогов, доступных командам pushd и popd.
  • HISTFILESIZE: максимальное количество строк, содержащееся в файле истории команд.
  • HISTSIZE: Количество команд, которые необходимо запоминать в списке истории.
  • HOSTNAME: текущее имя хоста.
  • IFS: Внутренний разделитель полей ввода в командной строке. По умолчанию установлен пробел.
  • PS1: определяет строку первичного приглашения – вид командной строки при запуске сессии оболочки. Переменная PS2 устанавливает строку вторичного приглашения, если команда занимает несколько строк.
  • SHELLOPTS: параметры оболочки, которые можно установить при помощи set.
  • UID: уникальный идентификатор текущего пользователя.

Создание переменных оболочки

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

$ TEST_VAR='Hello World!'

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

Полученная переменная оболочки действительна в текущей сессии, но не передается ее дочерним процессам. Чтобы убедиться, что данная переменная не является переменной среды, используем команду grep для фильтрации вывода команды env:

$ env | grep TEST_VAR
$

Данное действие не выведет никакого результата.

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

$ bash
$ echo $TEST_VAR

$

Возвращаемся в исходную оболочку:

$ exit

Создание переменных среды

Теперь попробуем превратить переменную оболочки в переменную среды. Это делается путем экспорта переменной:

$ export TEST_VAR

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

$ env | grep TEST_VAR
TEST_VAR=Hello World!

Можно также снова развернуть дочернюю оболочку:

$ bash
$ echo $TEST_VAR
Hello World!

Дочерняя оболочка получила переменную исходной оболочки. Попробуем экспортировать еще одну переменную, прежде чем покинуть дочернюю оболочку:

$ export NEW_VAR='New var value'

Проверим, экспортировалась ли переменная:

$ env | grep NEW_VAR
NEW_VAR=New var value

Теперь вернемся в исходную оболочку:

$ exit

Проверим, можно ли открыть данную переменную:

$ echo $NEW_VAR

$ 

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

Переменная NEW_VAR была установлена как переменная среды дочерней оболочки. Эта переменная действительна для данной оболочки и ее дочерних оболочек и процессов. После возвращения пользователя в исходную оболочку данная среда была разрушена.

Перемещение и сброс переменных

Переменная TEST_VAR все еще является переменной среды. Чтобы снова сделать ее переменной оболочки:

$ export -n TEST_VAR

Теперь эта переменная больше не является переменной среды:

$ env | grep TEST_VAR
$

Это снова переменная оболочки:

$ set | grep TEST_VAR
TEST_VAR='Hello World!'

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

$ unset TEST_VAR

Убедимся, что такой переменной больше нет:

$ echo $TEST_VAR

$

Результат не был выведен, поскольку переменная была сброшена.

Поиск: Bash • CLI • Linux • env • export • set • unset • Окружение • Переменная

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.