Поиск по сайту:

Как установить переменные среды в Bash в Linux


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

Как работают переменные среды

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

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

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

Среды и наследование

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

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

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

Глобальные переменные среды

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

  • SHELL: название оболочки, которая запускается при открытии окна терминала. В большинстве дистрибутивов Linux это будет bash, если вы не изменили его значение по умолчанию.
  • ТЕРМИН: Окна терминала на самом деле являются эмуляциями аппаратного терминала. Здесь содержится тип аппаратного терминала, который будет эмулироваться.
  • ПОЛЬЗОВАТЕЛЬ: имя пользователя, который в данный момент использует систему.
  • PWD: путь к текущему рабочему каталогу.
  • OLDPWD: каталог, в котором вы находились до перехода в текущий рабочий каталог.
  • LS_COLORS: список цветовых кодов, используемых ls , выделяет различные типы файлов.
  • ПОЧТА: если на вашем компьютере с Linux настроена система mail (по умолчанию это не так), она будет содержать путь к почтовому ящику текущего пользователя. почтовый ящик.
  • PATH: список каталогов, в которых оболочка будет искать исполняемые файлы команд.
  • ЯЗЫК: настройки языка, локализации и кодировки символов.
  • HOME: домашний каталог текущего пользователя.
  • _: Переменная среды подчеркивания (_) содержит последнюю введенную команду.

Мы можем видеть, на что настроены некоторые из них, используя не более сложные функции, чем echo, которые будут записывать значения в окно терминала. Чтобы увидеть значение переменной среды, необходимо добавить знак доллара ($) в начало ее имени.

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

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Чтобы создать собственные глобальные переменные среды, добавьте их в файл /etc/environment. Вам нужно будет использовать sudo для редактирования этого файла:

sudo gedit /etc/environment

Чтобы добавить переменную среды, введите ее имя, знак равенства (=) и значение, которое вы хотите сохранить в переменной среды. Не ставьте пробел перед или после знака равенства (=). Имя переменной среды может содержать буквы, знак подчеркивания (_) или цифры. Однако первым символом имени не может быть число.

Если в значении есть пробелы, обязательно заключите все значение в кавычки (\).

Сохраните файл, а затем выйдите из системы и войдите снова. Используйте echo, чтобы проверить, что новая переменная существует и содержит установленное вами значение:

echo $WEBSITE

Поскольку это глобальная переменная среды, доступная всем, пользователь mary может ссылаться на переменную среды при следующем входе в систему:

echo $WEBSITE

Чтобы увидеть все переменные среды одновременно, введите printenv. Вывода много, поэтому имеет смысл направить его через sort, а затем в less:

printenv | sort | less

Отсортированный список переменных среды отображается для нас в less.

Мы можем направить вывод через grep для поиска переменных среды, связанных с определенной темой.

printenv | grep GNOME

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

Это некоторые переменные среды оболочки, используемые в bash для указания или записи его поведения и функциональности. Некоторые значения обновляются по мере использования терминала. Например, переменная среды COLUMNS будет обновлена, чтобы отразить изменения, которые вы можете внести в ширину окна терминала:

  • BASHOPTS: параметры командной строки, которые использовались при запуске bash.
  • BASH_VERSION: номер версии bash в виде строки слов и цифр.
  • BASH_VERSINFO: версия bash в виде цифры.
  • СТОЛБЦЫ: текущая ширина окна терминала.
  • DIRSTACK: каталоги, добавленные в стек каталогов с помощью команды pushd.
  • HISTFILESIZE: максимально допустимое количество строк в файле history.
  • HISTSIZE: допустимое количество строк истории в памяти.
  • HOSTNAME: имя хоста компьютера.
  • IFS. Внутренний разделитель полей, используемый для разделения ввода в командной строке. По умолчанию это пробел.
  • PS1. Переменная среды PS1 содержит определение основной строки, строки по умолчанию и командной строки. Набор токенов, называемых управляющими последовательностями, может быть включен в определение вашей командной строки. Они представляют такие вещи, как имя хоста и пользователя, текущий рабочий каталог и время.
  • PS2: когда команда занимает более одной строки и ожидается дополнительный ввод, отображается дополнительная командная строка. Переменная среды PS2 содержит определение этой вторичной подсказки, которая по умолчанию является знаком больше (>).
  • SHELLOPTS: параметры оболочки, которые можно установить с помощью параметра set.
  • UID: идентификатор текущего пользователя.

Давайте проверим некоторые из этих переменных оболочки:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

Для полноты картины вот токены, которые вы можете использовать в определениях командной строки:

  • \t: текущее время в формате ЧЧ:ММ:СС.
  • \d: текущая дата, выраженная в виде дня недели, месяца, числа.
  • \n: символ новой строки.
  • \s: имя вашей оболочки.
  • \W: имя вашего текущего рабочего каталога.
  • \w: путь к вашему текущему рабочему каталогу.
  • \u: имя пользователя, вошедшего в систему.
  • \h: имя хоста компьютера.
  • \#: Каждая команда в оболочке пронумерована. Это позволяет вам видеть номер команды в командной строке. Это не то же самое, что номер, который команда будет иметь в списке history.
  • \$: устанавливает в качестве последнего символа подсказки знак доллара ($) для обычного пользователя и символ решетки (#) для пользователя root. Это работает путем проверки UID пользователя. Если он равен нулю, пользователь root.

Вы найдете определение переменной среды PS1 в файле .bashrc.

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

Чтобы создать переменные среды для собственного использования, добавьте их в конец файла .bashrc. Если вы хотите, чтобы переменные среды были доступны для удаленных сеансов, таких как SSH-подключения, вам также необходимо добавить их в файл .bash_profile.

Формат определения переменной среды одинаков для обоих файлов. Чтобы добавить определение в файл .bash_profile, введите его в своем домашнем каталоге:

gedit .bashrc

Мы добавили переменную среды с именем INHERITED_VAR. Обратите внимание на слово «экспорт» в начале строки.

Сохраните и закройте файл после завершения редактирования. Вы можете выйти из системы и снова войти в нее или заставить оболочку повторно прочитать файл .bash_profile с помощью команды точки (.) следующим образом:

. .bashrc

Теперь давайте создадим переменную среды в командной строке:

LOCAL_VAR="This session only"

Если мы используем echo, мы видим, что нам доступны обе переменные окружения:

echo $LOCAL_VAR
echo $INHERITED_VAR

Вы заметите, что в определении переменной среды INHERITED_VAR в начале строки есть слово «экспорт». Это означает, что переменная среды будет унаследована дочерними процессами текущей оболочки. Если мы запустим еще один с помощью команды bash, мы сможем снова проверить две переменные изнутри дочерней оболочки:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Как видите, INHERITED_VAR доступен в дочерней оболочке, а LOCAL_VAR — нет. Мы просто получаем пустую строку.

Хотя «экспорт» добавляет часть переменной среды к среде, которую наследуют дочерние процессы, INHERITED_VAR не является глобальной переменной среды. Например, пользователь mary не может ссылаться на него:

echo $INHERITED_VAR

Чтобы закрыть дочерний сеанс bash, мы используем exit:

exit

Унаследованные среды также влияют на сценарии. Вот простой скрипт, который записывает значения трех переменных среды в окно терминала:

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

Это было сохранено в файл с именем envtest.sh, а затем сделано исполняемым со следующим:

chmod +x envtest.sh

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

./envtest.sh

Сценарий может видеть глобальную переменную среды WEBSITE и экспортированную переменную среды INHERITED_VAR. Он не может получить доступ LOCAL_VAR, даже если скрипт выполняется в той же оболочке, где была создана переменная.

Если нам нужно, мы можем экспортировать переменную среды из командной строки. Мы сделаем это с нашим LOCAL_VAR, а затем снова запустим скрипт:

export LOCAL_VAR
./envtest.sh

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

Удаленные подключения

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

(Рискуя запутать, есть также файл .profile. Он также может содержать определения переменных среды. Однако файл .profile не читается, если .bash_profile, поэтому самым безопасным и совместимым с bash способом является использование файла .bash_profile.)

Чтобы отредактировать файл .bash_profile, мы снова воспользуемся gedit:

gedit .bash_profile

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

Сохраните изменения и закройте gedit.

На другом компьютере мы установим SSH подключение к тестовому компьютеру.

ssh dave@howtogeek.local

Как только мы подключимся, мы запустим скрипт еще раз:

./envtest.sh

Файл .bash_profile был прочитан как часть инициализации удаленного входа в систему, и переменная среды INHERITED_VAR доступна нам и сценарию.

Сброс переменной среды

Чтобы сбросить переменную среды, используйте команду unset. Если мы отключим глобальную переменную среды WEBSITE и экспортированную переменную среды INHERITED_VAR, они больше не будут доступны ни в командной строке, ни в дочерних процессах:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

Следует отметить, что это только изменяет доступность глобальных переменных среды для вас в этом сеансе. Другой человек, вошедший в систему одновременно, по-прежнему сможет получить доступ к своему экземпляру этой глобальной переменной среды. Его экземпляр был инициализирован и прочитан из файла /etc/environment во время его входа в систему и не зависит от чьей-либо копии переменной.

Например, пользователь mary по-прежнему может получить доступ к переменной среды WEBSITE и прочитать ее значение, даже если пользователь dave установил unset это в его сессии:

echo $WEBSITE

Экологический контроль

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

RELATED: Best Linux Laptops for Developers and Enthusiasts