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

5 февраля 2021 |

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

A stylized Linux terminal with lines of green text on a laptop. fatmawati achmad zaenuri / Shutterstock

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

sudo gedit / etc / environment

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

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

The /etc/environment file opened in an editor and a new environment variable being added.

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

echo $ WEBSITE

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

echo $ WEBSITE

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

printenv | сортировать | less

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

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

printenv | grep GNOME

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

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

  • BASHOPTS: параметры командной строки, которые использовались при запуске bash.
  • BASH_VERSION: номер версии bash в виде строки слов и чисел.
  • BASH_VERSINFO: версия bash в виде цифры.
  • COLUMNS: текущая ширина окно терминала.
  • DIRSTACK: каталоги, которые были добавлены в стек каталогов командой pushd.
  • HISTFILESIZE: максимальное количество строк, разрешенное в файле истории.
  • HISTSIZE: допустимое количество строк истории в памяти.
  • HOSTNAME: имя хоста компьютера.
  • IFS: внутренний разделитель полей, используемый для разделения ввода в командной строке. По умолчанию это пробел.
  • PS1: переменная среды PS1 содержит определение основной, стандартной и командной строки. Набор токенов, называемых escape-последовательностями, может быть включен в определение вашей командной строки. Они представляют такие вещи, как хост и имя пользователя, текущий рабочий каталог и время.
  • PS2: если команда занимает более одной строки и ожидается ввод большего количества данных, отображается дополнительная командная строка. Переменная среды PS2 содержит определение этого вторичного приглашения, которое по умолчанию представляет собой знак «больше» (& gt,).
  • SHELLOPTS: параметры оболочки, которые можно установить с помощью параметра set.
  • UID: идентификатор текущего пользователя.

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

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

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

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

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

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

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

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

gedit .bashrc

.bashrc file lodaed into an editor and a new environment variable added as the last line in the file.

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

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

.bashrc

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

LOCAL_VAR = «Только этот сеанс»

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

echo $ LOCAL_VAR echo $ INHERITED_VAR

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

bash echo $ LOCAL_VAR echo $ INHERITED_VAR

As вы можете видеть, что 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

Unsetting an environment variable on Bash on Linux.

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

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

echo $ WEBSITE

Контроль окружающей среды

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

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


Напишите пару строк: