5 как изменить значения переменных окружения удалить переменную

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

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

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

Виды переменных окружения

Если смотреть более широко, переменная окружения может быть трех типов:

1. Локальные переменные окружения

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

2. Пользовательские переменные оболочки

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

3. Системные переменные окружения

Эти переменные доступны во всей системе, для всех пользователей. Они загружаются при старте системы из системных файлов конфигурации:  /etc/environment, /etc/profile, /etc/profile.d/ /etc/bash.bashrc.

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

.bashrc

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

.bash_profile

Эти переменные вступают в силу каждый раз когда пользователь подключается удаленно по SSH. Если этот файл отсутствует система будет искать .bash_login или .profile.

/etc/environment

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

/etc/bash.bashrc

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

/etc/profile

Системный файл profile. Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно. Но они не будут доступны, при создании локальной терминальной сессии, то есть если вы просто откроете терминал.

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

source имя_файла

Добавление пользовательских и системных переменных окружения в Linux

Теперь, когда вы знаете немного теории, перейдем к практике. Локальные переменные окружения в Linux можно создавать следующими командами:

var=значение
export var=значение

Эти переменные будут доступны только для текущей терминальной сессии.

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

1. Использование env

По умолчанию с помощью env можно посмотреть все установленные переменные среды. Но с опцией -i она позволяет временно удалить все переменные оболочки и выполнить команду без переменных.

$ env -i [переменная=значение] команда

Var — это любая переменная, которую вы хотите передать этой команде.

Такая команда запустит оболочку вообще без переменных окружения:

env -i bash

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

2. Использование unset

Это другой способ удаления переменных окружения Linux. Unset удаляет переменную по имени до конца текущей сессии:

unset имя_переменной

3. Установить значение переменной в »

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

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

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

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

1. Устанавливаем и удаляем локальные переменные в Linux

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

VAR1='Losst'
echo $VAR1
unset VAR1
echo $VAR1

env2

Другой способ создать переменную — команда export. Удалим ее присвоив пустое значение:

export VAR='Losst'
echo $VAR
VAR=
echo $VAR

env1

Теперь создадим переменную VAR2 также зададим ей значение. А потом временно удалим все локальные переменные выполнив env -i. Она запустит оболочку без каких-либо переменных. После ввода exit все переменные будут восстановлены.

VAR2='Losst'
echo $VAR2
env -i bash
echo $VAR2

env4

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

Отредактируйте файл .bashrc, в вашей домашней директории, добавив команду export, для экспортирования нужной переменной. Затем выполните команду source для применения изменений. Создадим, например, переменную CD:

vi .bashrc

Добавьте такую строчку (o, затем вставить, затем Esc и :wq):

export CD='This is Losst Home'

Теперь осталось обновить конфигурацию:

source .bashrc
echo $CD

env5

Для удаления этой переменной просто удалите ее из .bashrc.

Теперь добавим переменную окружения с помощью .bash_profile. Эта переменная, как вы уже знаете будет доступна только при удаленном входе:

vi .bash_profile

Добавьте строчку:

export VAR2='This is Losst Home'

И выполните эти команды, чтобы применить изменения и проверить добавление переменной:

source .bash_profile
echo $VAR2

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

ssh user@localhost
echo $VAR2

env7

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

Замечание: Эти переменные доступны всегда, но не для всех пользователей.

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

Создадим переменную, доступную для всех пользователей, во всех терминальных сессиях, кроме удаленных, добавлением ее в /etc/bash.profile:

vi /etc/bash.profile
export VAR='This is system-wide variable'

Затем обновляем:

source /etc/bash.bashrc

Теперь эта переменная доступна для всех пользователей, во всех терминалах:

echo $VAR
sudo su
echo $VAR
su -
echo $VAR

env8

Если вы хотите сделать переменную окружения доступной для всех пользователей, которые подключаются к этой машине удаленно, отредактируйте файл /etc/profile:

vi /etc/profile

export VAR1='This is system-wide variable for only remote sessions'

Обновите конфигурацию, и проверьте доступность переменной, она будет доступна только удаленно:

source /etc/profile
echo $VAR1

Если нужно добавить переменную окружения в Linux, так чтобы она была доступна и удаленно, и для локальных сессий, экспортируйте ее в /etc/environment:

vi /etc/environment

export VAR12='I am available everywhere'

Проверяем:

source /etc/environment
echo $VAR12
sudo su
echo $VAR12
exit
ssh localhost
echo $VAR12

env9

Как видите, переменная доступна и для локальных пользователей и удаленно.

Выводы

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

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

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

Содержание

  1. Зачем нужны переменные окружения?
  2. Получение информации о переменных окружения
  3. Виды переменных окружения
  4. Системные переменные
  5. Пользовательские переменные
  6. Временные или переменные сеанса
  7. Установка переменных окружения

Зачем нужны переменные окружения?

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

Но как программы «узнают», где можно найти те или иные ресурсы? Из переменных окружения. Таким же образом происходит запуск и исполнение команд в командной консоли, т. к. благодаря переменной окружения PATH интерпретатор bash (или любая другая командная оболочка) находит программу (исполняемый файл или библиотеку) по указанному в PATH пути. И таким же образом, к примеру, команда man «знает», что запрашиваемые страницы справочных руководств нужно искать согласно значению переменной окружения MANPATH.

Получение информации о переменных окружения

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

$ printenv
GS_LIB=/home/john/.fonts
KDE_FULL_SESSION=true
LANG=ru_RU.UTF-8
DISPLAY=:0
OLDPWD=/home/john/builds/wxwidgets
PWD=/home/john
HOME=/home/john
. . .
SHELL=/bin/bash
PATH=/opt/wxwidgets/bin:/home/john/.config/composer/vendor/bin:/usr/bin

В данном выводе представлен сильно сокращённый список переменных окружения для Kubuntu 18.04. Также следует заметить, что представленный список относится к пользовательскому набору, доступному текущему пользователю. Если выполнить команду printenv от имени суперпользователя (root), то набор переменных будет несколько отличаться.

Как следует из вышеприведённого вывода, для пользователя john используется русская локализация для сеанса (LANG), в качестве командного интерпретатора по-умолчанию используется bash (SHELL), текущим активным каталогом является /home/john (PWD), а переменная PATH модифицирована и содержит в себе (кроме дефолтного /usr/bin) значения /opt/wxwidgets/bin и /home/john/.config/composer/vendor/bin. Значение каждой переменной окружения представляет собой, как можно видеть, набор параметров, разделённых двоеточиями.

Тот же список можно вывести, если дать команду env. Также можно использовать команду export с ключом -p:

$ export -p

Для вывода значения конкретной переменной:

$ echo $PATH

или:

$ printenv | grep PATH

В последнем случае будет выведены все переменные, содержащие фразу «PATH».

Виды переменных окружения

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

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

Имя Описание
HOME Определяет путь к домашнему каталогу текущего пользователя
PWD Определяет текущий активный каталог
OLDPWD Предыдущий активный каталог
SHELL Определяет программу-командную оболочку
TERM Содержит имя текущей запущенной программы-терминала
PAGER Определяет программу для постраничного вывода страниц справочных руководств
EDITOR Определяет программу для редактирования текстовых файлов
VISUAL Определяет программу для редактирования текстовых файлов с расширенными возможностями (vim, emacs)
MAIL Определяет путь к каталогу, в котором должны храниться файлы входящей электронной почты.
BROWSER Определяет веб-браузер, запускаемый по-умолчанию
ftp_proxy

http_proxy

Определяют, соответственно адреса для прокси-серверов по FTP и HTTP протоколам
MANPATH Определяет каталог, в котором содержатся подкаталоги, содержащие man-страницы справочных руководств системной справки для команды man
INFODIR Определяет список каталогов для поиска info-страниц для команды info
TZ Определяет временную зону. Доступные временные зоны хранятся в /usr/share/zoneinfo

Системные переменные

Согласно стандартам Linux переменные окружения для организации системной среды хранятся в нескольких файлах:

  • /etc/bash.bashrc – хранение переменных для командных оболочек;
  • /etc/profile – хранение переменных для интерактивных оболочек;
  • /etc/environment – переменные из этого файла используются модулем

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

Пользовательские переменные

Для систем, ориентированных на многопользовательский доступ, например на хостинговых площадках, конкретному пользователю полезно иметь возможность гибко настраивать своё собственное рабочее окружение, создавая новые переменные или дополняя их новыми значениями. К примеру, владельцу сайта, для его виртуального хоста, обслуживающего сайт на CMS Drupal, захотелось установить утилиту drush, которая облегчает и ускоряет обслуживание CMS. В этом случае достаточно после локальной установки (в каком-нибудь подкаталоге домашнего каталога) drush, дополнить переменную PATH значением, содержащим путь к утилите drush в файле ~/.bashrc. В результате командная оболочка сможет запускать команду drush для данного пользователя.

По стандартам соглашений для Linux-систем конфигурация для пользовательского окружения должна храниться в следующих файлах:

  • ~/.bashrc – для хранения параметров инициализации выбранной командной оболочки для пользователя;
  • ~/.profile – для инициализации доступных пользователю командных оболочек;
  • ~/.pam_environment – для использования модулем

Временные или переменные сеанса

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

$ source файл_скрипта

Или же устанавливать их вручную командой export.

Установка переменных окружения

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

ИМЯ=’значение’

Например:

$ SOMEVAR=’somevalue’
$ echo $SOMEVAR
somevalue

Если нужно временно модифицировать переменную PATH, то можно выполнить export:

$ export PATH="${PATH}:/home/john/tmp/usr/bin"

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

$ unset SOMEVAR

Для установки системных или пользовательских переменных окружения следует помещать код с нужными переменными в соответствующие файлы инициализации окружения. Например, чтобы добавить на системном уровне какой-либо пользовательский каталог (пусть это будет ~/bin), нужно один из файлов (/etc/profile  или /etc/bash.bashrc) дополнить следующим кодом:

export PATH=”$HOME/bin:$PATH”

В случае, если нужно выполнить то же самое для пользовательского уровня переменных окружения, то редактировать нужно файл (для локального входа) ~/.bashrc (для удалённого входа, например по SSH –  ~/.bash_profile):

export PATH=”$HOME/.config/composer/vendor/bin:$PATH”

Этот код включит использование командным интерпретатором вышеупомянутой команды drush (предварительно установленной по указанному пути, конечно) для CMS Drupal.

Чтобы можно было видеть сделанные изменения, нужно их зафиксировать:

$ source ~/.bashrc

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Содержание

  • Работа с переменными окружения в Linux
    • Конфигурационные файлы для пользовательских и системных переменных
    • Просмотр списка системных переменных окружения
    • Список основных системных и пользовательских переменных окружения
    • Запуск команд с указанием нового значения переменной окружения
    • Установка и удаление локальных переменных окружения
    • Добавление и удаление пользовательских переменных
    • Создание и удаление системных переменных окружения
  • Вопросы и ответы

Переменные окружения в Linux

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

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

  1. Системные переменные. Эти опции загружаются сразу же при старте операционной системы, хранятся в определенных конфигурационных файлах (речь о них будет идти ниже), а также доступны для всех пользователей и всей ОС в целом. Обычно такие параметры считаются самыми главными и часто используемыми во время старта самых различных приложений.
  2. Пользовательские переменные. Каждый пользователь имеет свою домашнюю директорию, где хранятся все важные объекты, к их числу относятся и конфигурационные файлы пользовательских переменных. Из их названия уже понятно, что применяются они под конкретного юзера в то время, когда он авторизован через локальный «Терминал». Действуют они и при удаленном соединении.
  3. Локальные переменные. Существуют параметры, применяемые только в рамках одной сессии. При ее завершении они будут навсегда удалены и для повторного старта все придется создавать вручную. Они не сохраняются в отдельных файлах, а создаются, редактируются и удаляются при помощи соответствующих консольных команд.

Конфигурационные файлы для пользовательских и системных переменных

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

  • /ETC/PROFILE — один из системных файлов. Доступен для всех пользователей и всей системы даже при удаленном входе. Единственное ограничение для него — параметры не принимаются при открытии стандартного «Терминала», то есть в этом расположении никакие значения из этой конфигурации работать не будут.
  • /ETC/ENVIRONMENT — более широкий аналог предыдущей конфигурации. Он функционирует на системном уровне, имеет те же опции, что и предыдущий файл, но теперь без каких-либо ограничений даже при удаленном подключении.
  • /ETC/BASH.BASHRC — файл только для локального использования, при удаленной сессии или соединении через интернет функционировать он не будет. Выполняется для каждого юзера отдельно при создании новой терминальной сессии.
  • .BASHRC— относится к конкретному юзеру, хранится в его домашней директории и выполняется каждый раз при новом запуске терминала.
  • .BASH_PROFILE — то же, что .BASHRC, только для удаленного взаимодействия, например, при использовании SSH.

Читайте также: Установка SSH-server в Ubuntu

Просмотр списка системных переменных окружения

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

  1. Запустите «Терминал» через меню или зажатием горячей клавиши Ctrl + Alt + T.
  2. Запуск терминала для работы с переменными окружения в Linux

  3. Пропишите команду sudo apt-get install coreutils, чтобы проверить наличие данной утилиты у вас в системе и сразу же установить ее при надобности.
  4. Установка утилиты для работы с переменными окружения в Linux

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

  7. Вы будете уведомлены о добавлении новых файлов или их наличии в библиотеках.
  8. Завершение установки утилиты для переменной окружения в Linux

  9. Теперь воспользуйтесь одной из команд установленной утилиты Coreutils, чтобы раскрыть список всех переменных окружения. Напишите printenv и нажмите на клавишу Enter.
  10. Просмотр всех переменных окружения в Linux

  11. Ознакомьтесь со всеми параметрами. Выражение до знака = — название переменной, а после — ее значение.
  12. Ознакомление с параметрами и их значениями через просмотр переменных в Linux

Список основных системных и пользовательских переменных окружения

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

  • DE. Полное название — Desktop Environment. Содержит имя текущего окружения рабочего стола. В операционных системах на ядре Linux используются различные графические оболочки, поэтому приложениям важно понимать, какая сейчас активна. В этом и помогает переменная DE. Пример ее значений — gnome, mint, kde и так далее.
  • PATH — определяет список директорий, в которых происходит поиск различных исполняемых файлов. Например, при действии одной из команд по поиску и доступу к объектам они обращаются к этим папкам для быстрого поиска и передачи исполняемых файлов с указанными аргументами.
  • SHELL — хранит в себе опцию активной командной оболочки. Такие оболочки позволяют пользователю самостоятельно прописывать определенные скрипты и запускать различные процессы с помощью синтаксисов. Самой популярной оболочкой считается bash. Список остальных распространенных команд для ознакомления вы найдете в другой нашей статье по следующей ссылке.
  • Читайте также: Часто используемые команды в «Терминале» Linux

  • HOME — здесь все достаточно просто. Данный параметр указывает путь к домашней папке активного юзера. У каждого юзера он разный и имеет вид: /home/user. Объяснение этому значению тоже легкое — эта переменная, например, используется программами для установления стандартного места расположения их файлов. Конечно, примеров существует еще огромное количество, но для ознакомления этого достаточно.
  • BROWSER — содержит в себе команду для открытия веб-обозревателя. Именно эта переменная чаще всего и определяет браузер по умолчанию, а все остальные утилиты и ПО обращаются к указанной информации для открытия новых вкладок.
  • PWD и OLDPWD. Все действия из консоли или графической оболочки происходят из определенного расположения в системе. Первый параметр отвечает за текущее нахождение, а второй показывает предыдущее. Соответственно, их значения меняются достаточно часто и хранятся как в пользовательских конфигурациях, так и в системных.
  • TERM. Программ-терминалов для Linux существует большое количество. Упомянутая переменная хранит в себе информацию о названии активной консоли.
  • RANDOM — содержит в себе скрипт, генерирующий каждый раз случайное число от 0 до 32767 при обращении к этой переменной. Такая опция позволяет другому софту обходиться без собственного генератора случайных чисел.
  • EDITOR — отвечает за открытие редактора текстовых файлов. Например, по умолчанию вы можете встретить там путь /usr/bin/nano, но ничего вам не мешает изменить его на любой другой. За более сложные действия с тестом отвечает VISUAL и запускает, например, редактор vi.
  • HOSTNAME — имя компьютера, а USER — имя текущей учетной записи.

Запуск команд с указанием нового значения переменной окружения

Можете самостоятельно на время изменить опцию любого параметра, чтобы запустить с ним определенную программу или выполнить любые другие действия. В таком случае в консоли вам будет достаточно прописать env VAR=VALUE, где VAR — название переменной, а VALUE — ее значение, например, путь к папке /home/user/Download.

Lumpics.ru

Запустить команду с присвоением нового значения переменной окружения в Linux

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

Временное значение переменной окружения в Linux

Установка и удаление локальных переменных окружения

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

  1. Запустите «Терминал» и напишите команду VAR=VALUE, после чего нажмите на клавишу Enter. Как обычно, VAR — любое удобное название переменной одним словом, а VALUE — значение.
  2. Записать новую локальную переменную окружения в Linux

  3. Проверьте действенность произведенных действий, введя echo $VAR. Строчкой ниже вы должны получить опцию переменной.
  4. Проверить работу локальной переменной окружения в Linux

  5. Удаляется любой параметр командой unset VAR. Проверить удаление можно также через echo (следующая строка должна быть пустой).
  6. Удалить локальную переменную окружения в Linux

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

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

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

  1. Откройте пользовательскую конфигурацию через sudo gedit .bashrc. Мы предлагаем использовать графический редактор с обозначением синтаксиса, например, gedit. Однако указать можно любой другой, например, vi либо nano.
  2. Запустить пользовательский конфигурационный файл переменных окружения в Linux

  3. Не забывайте о том, что при запуске команды от имени суперпользователя потребуется ввести пароль.
  4. Ввод пароля для запуска конфигурационного файла пользователя в Linux

  5. В конце файла добавьте строку export VAR=VALUE. Количество таких параметров ничем не ограничивается. Кроме всего, вы можете изменить значение уже присутствующих переменных.
  6. Добавить переменную в конфигурационный файл пользователя в Linux

  7. После внесения изменений сохраните их и закройте файл.
  8. Сохранить изменения конфигурационного файла пользователя в Linux

  9. Обновление конфигурации произойдет после повторного старта файла, а делается это через source .bashrc.
  10. Перезапустить конфигурационный файл пользователя Linux

  11. Проверить активность переменной можно через ту же опцию echo $VAR.
  12. Проверить значение переменной файла пользователя в Linux

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

Создание и удаление системных переменных окружения

Осталось только затронуть третий класс переменных — системные. Редактироваться для этого будет файл /ETC/PROFILE, который остается активным даже при удаленном подключении, например, через известный многим менеджер SSH. Открытие конфигурационного элемента осуществляется примерно так же, как и в предыдущем варианте:

  1. В консоли введите sudo gedit /etc/profile.
  2. Запустить системный конфигурационный файл переменных в Linux

  3. Внесите все необходимые изменения и сохраните их, нажав на соответствующую кнопку.
  4. Редактировать системную конфигурацию переменных в Linux

  5. Перезапустите объект через source /etc/profile.
  6. Перезапустить системную конфигурацию переменных в Linux

  7. По окончании проверьте работоспособность через echo $VAR.
  8. Проверить работу системной переменной окружения в Linux

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

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

����������


����� 4. ���������

4.1. �������� � ���������
4.2. ������ environ
4.3. ������ ���������: getenv()
4.4. ������ ���������: setenv()
4.5. ����� ����������� ���������: putenv()
4.6. �������� ���������� ���������: unsetenv()
4.7. ������� ���������: clearenv()

4.1. �������� � ���������

��������� (environment) ��� ����� — ��� ����� ��� ����������=��������,
��������� ������� ����������������� ��������. ����� �������, ��������� — ���
����� ���������� ���������. ���� �� ����������� ��������, �������� �� bash, ��
�� ��� ������� ���� ����� ����� ���� ��������������.

��� ����, ����� ���������� ���������, ������ ������� ������� env ��� ����������.
� ����������� �� ������������ �������, ����� env ����� ������ ���������
�������, ������� ����� ������� ���:


$ env > myenv
$

��� ���:


$ env | more

��� ���:


$ env | less
$

���������� ��������� ����� ������������� ��� �� ���������, ��� � �� ��������
��������, ������ ����������� ��������� ��������� �� � ������� ��������. ��
����� �� ����� ��������� �� ����� ����������� �������.

��� ���������� ��������� ����� �������� �����, �� �������� ��� ���������� —
��������� ���� � �� �� ��������� �������� � ������ ������������� ��-�������.
�������, ��������, ����� ��������� «���������» ��� ������������ ��� ��������
������� ������������. ���� ����� ����� ���������� «����������» �� ����������
��������� USER � HOME ��������������.

�������� ������ ���������� ��������� ���������� ������������ ����� ���������
��������� (������). ������������� �������� ���������� ��������� ����������� ��
���������. ����� �������, ��� ���������� ��������� ����� ��� char*, � ����
��������� ����� ��� char**. ����� ������� �� ����� �������� �����-������
���������� ���������, ���������� ������� echo $���_����������:


$ echo $USER
nn
$ echo $HOME
/home/nn
$

������ ������, ��� ������ � ��������� bash, ������ $���_���������� ����������
�� ���� �������� ����������, ���� ������ ��� ������ �� ����������� � ��������,
���������� ��� � ������������. � ���� ������, ��������, ������ $HOME ����������
�� /home/nn. �� ���� ������� mkdir $HOME/mynewdir ������� � ���� ��������
�������� ���������� mynewdir.

� ������ �������� � � ������ ������������� ��������� ���������� �� ������
���������� ����������, �� � ��������/����������� ���� ����������. ������������,
������������ ������������� MUA (Mail User Agent), ��������� Mozilla-mail, Kmail
��� Sylpheed ���� �� ����� ����� � ����� ��������� (�� ������� ���� � �������)
���������� MAIL ��� MAILDIR. � ������������� mutt, pine ��� elm (� ���������
� ���� fetchmail/getmail, procmail � ����.) ��� ���������� �������� ����������.
������������, �� ������������ ����������� ��������, ���� �� ����� ����� � �����
��������� ���������� QTDIR. ���� ��������� �� ���������� ���������, �������
���� ����� � ���� ������������� Linux:

  • USER — ��� �������� ������������
  • HOME — ���� � ��������� �������� �������� ������������
  • PATH — ������ ���������, ����������� �����������, � �������
    ������������ «�����» ��������
  • PWD — ������� �������
  • OLDPWD — ���������� ������� �������
  • TERM — ��� ���������
  • SHELL — ������� ��������� ��������

��������� ���������� ��������� ������� �� �� ���� ��������, �� ���-���� �������
����������:

  • HOSTNAME — ��� ������
  • QTDIR — ������������ ���������� QT
  • MAIL — �������� ����
  • LD_LIBRARY_PATH — ����� «������» �������������� ��������� (��.
    ���������� �����)
  • MANPATH — ����� ������ ������ man-������� (��������, �����������
    ����������)
  • LANG — ���� � ��������� ������������ (������ LANGUAGE)
  • DISPLAY — ������� ������� � X11

������ ���������� ���������, ��������� ��������, ����� ��� bash �����������
����������� ������� ��� ����������=��������. ��� ���������� ��������. �����
����� ���������� �������� ���������� (��� ������) ��������. ��� ����������
���-�� ���������� ��������� (��������) ���������� � ����� C. ��� ���������� ���
������ �������� (� ��� ����� � ��� env) � ������������ � �������� � ���������
��������. ����� ������ ���������� ��������, ���������� �������� � ���������
������ ����������=��������.


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

������, ��� �������, ����� �������� ��������� ���������� �������� � ��������
���������. ��� ����� ������������ ������� export:


$ export MYVAR
$ env | grep MYVAR
MYVAR=Hello
$

����� ������� ����� ���:


$ export MYNEWVAR=Goodbye
$ echo $MYNEWVAR
Goodbye
$ env | grep MYNEWVAR
MYNEWVAR=Goodbye
$

������, ��� ���������� ������, ���������� ���������� � ����������� ���������,
����� ����� ��� ������. �������� ����������������� �����, ������������� �� �
�������� �������� ���������� ���������; ����� �� ������������ � ��������
�������� ���������� ��������� ������, ���������� �������; ���� �����, �� ���?

������ ���������� � ���, ������ ������� ���������. ����� ���������� �
���������� � Linux ��������� — ��� �������. �������� ������ ���� � �� ��
���������, �� ��������� ��� ��������. � ������� �������� (����� init) ����
���� �������-��������. ����� �� ��������� � ��������� ������ vim, � �������
���������� ����� �������, �������������� ���������� ��������� vim;
������������ ��������� ����� ����� �������� (bash, ��������). ��� �����
�������� ����� ������� ����� ��������. �� ����� �������� ������� �������� �
����������� ������ �����. ������ �� ����� ����: ����� ������� ��������
����� ������������� ���������.
�� ����� ������� ���������� ���������
����������, �� �� ���� �� ���� �������� �� �����. ����� ��, ��� � �������
�������� ���� ����������� ����� ���������, � ������� ������� �����
������ ��� ��� ������. ���� ������� �����������, �� ����� ��������; ����
������� ������� ������, �������� �������, �� ���� ����� ������� �������� �����
��������� ������ ��������. �� ��� ������������ ���������� � ���������� ���
�������� ���������������.

4.2. ������ environ

������, ����� �� �����������, ��� ����� ���������, ����� ����� ��������
��������� ��� �������������� � ����������. ����� ��������, ��� ��� ���
��������, ������� ��������� ���������.

� ������������ ����� unistd.h �������� ������� ��������� ������ environ:


extern char ** environ;

� ���� ������� �������� ����� ��������� ��������. �����.

������ �� �����������, �� � �� ���������� ��� �������� ��� — ��� ������ (���
���������) � �������� ������ ������ ����������������. ��� ��������� environ ����
����������� ���������, ������� �� ���������� ���� �����. ������, ��� ���������
������� ������ ��������� ��� � ������� � ��������� �� «��������».

� ������ environ ��� ����� �� ��������. ������� ����������� ���������
(environ), ������� � �������� ��������� ���������� ��� ����������. ���������
����� ���������, ���������� �� ��� ���������� � ���������; � ���� ����������, ��
������ �� ��������. ��� �� ����� ������, ��� ����� ���� �� ������� �����������
�����. �� � �����������: �� ���������� ���������. ��� ��� ���������:


/* environ.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

extern char ** environ;	/* Environment itself */

int main (int argc, char ** argv)
{
	int i;
	if (argc < 2)
	{
		fprintf (stderr, "environ: Too few argumentsn");
		fprintf (stderr, "Usage: environ <variable>n");
		exit (1);
	}
	
	for (i = 0; environ[i] != NULL; i++)
	{
		if (!strncmp (environ[i], argv[1], strlen (argv[1])))
		{
			printf ("'%s' foundn", environ[i]);
			exit (0);
		}	
	}
	printf ("'%s' not foundn", argv[1]);
	exit (0);
}

� ��� Makefile ��� ���� ��������� (���� �����):


# Makefile for environ

environ: environ.c
	gcc -o environ environ.c

clean:
	rm -f environ

���������:


$ make
gcc -o environ environ.c
$ ./environ
environ: Too few arguments
Usage: environ <variable>
$ ./environ USER
'USER=nn' found
$ ./environ ABRAKADABRA
'ABRAKADABRA' not found
$

� ����������� ������� �� ����������� ������� �������������� ������ �������
environ, ��� ��� ���������� � �������� ������������ � ��� � ������� ����
(����������=��������). � ������� ��� ������ �� �������� ������������
�������������� ������ ������� environ. � ��������� �������������� ����� �������
����� ���������� � �����, ����������� ���������������.

4.3. ������ ���������: getenv()

� ������������ ����� stdlib.h ��������� ������� getenv , ������� ����������,
��� � ���������� ������� �� �������� ���������. ���� �������� ��������������
�������� ���� �������.


char * getenv (const char * name);

������� ��� �������� ����� ������: ���� � �������� ��������� ������� ���
������������ ���������� ���������, �� ������� ���������� ��������� �� ������,
���������� �������� ���� ����������; ���� ���������� �����������, ������������
NULL.

��� �����, ������� getenv() ��������� �� ������������ �������������� ������
environ. ������� ����� ���������, ������� ������ �� ��, ��� � ����������,
������ ����� ������� ��������. ������� �� getenv �� ����� ������� — ���������
���������.


/* getenv.c */
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char ** argv)
{
	if (argc < 2)
	{
		fprintf (stderr, "getenv: Too few argumentsn");
		fprintf (stderr, "Usage: getenv <variable>n");
		exit (1);
	}
	char * var = getenv (argv[1]);
	if (var == NULL)
	{
		printf ("'%s' not foundn", argv[1]);
		exit (0);
	}
	printf ("'%s=%s' foundn", argv[1], var);
	exit (0);
}

4.4. ������ ���������: setenv()

������ ���� �������������� ���������! ��� ��� ���������: ������ �������
�������� �� ������ � ���������, � ����� ��������� ������������� ��������
(� ����� ������ ��� ��������� ��������). ����� �������� � ��������� �����
���������� ��� �������� ������������, ������������ ������� setenv, �����������
� ����� stdlib.h. ���� �������� �������������� �������� ���� �������.


int setenv (const char * name, const char * value, int overwrite);

���� ������ ������, ��� ������ «�������������� ��������», ��������� �
/usr/include/stdlib.h �� ���������� ������� getenv() � setenv() � ������ ��
����������� ;-)

������� setenv() ������������� �������� (������ ��������, value) ��� ����������
��������� (������ ��������, name). ������ �������� — ��� ���� ����������. ���
��������� ����� ��� ������������ ���������� ����������������, ��� ������� �����
����������, ���� ��� ����������, — �� ����������������. � ������ ���������
���������� setenv() ���������� ���� (���� ���� ������������ ���������� ��
�������������� ��� overwrite==0). ���� � ��������� ��� ����� ��� �����
����������, �� setenv() ���������� -1.

���� ����� ��������� setenv ������ �� ��������� ������ ��� ���������: ���
���������� � �������� ���� ����������. ���� ���������� �� ����� ����
�����������, ��������� ������, ���� ������ �� ���������, ��������� ��������� �
������� ����������=��������. ��� ��� ���������:


/* setenv.c */
#include <stdio.h>
#include <stdlib.h>

#define FL_OVWR		0	/* Overwrite flag. You may change it. */

int main (int argc, char ** argv)
{	
	if (argc < 3)
	{
		fprintf (stderr, "setenv: Too few argumentsn");
		fprintf (stderr, 
			"Usage: setenv <variable> <value>n");
		exit (1);
	}
	if (setenv (argv[1], argv[2], FL_OVWR) != 0)
	{
		fprintf (stderr, "setenv: Cannot set '%s'n", argv[1]);
	       	exit (1);
	}

	printf ("%s=%sn", argv[1], getenv (argv[1]));	
	exit (0);
}

������� ��������� FL_OVWR ����� ��������� �������� ��������� ��������� ��
��������� � ������������ ���������� ���������. ��� ��� ���������: � �������
�������� ���� ����� ���������, ������� ������������ ��� ���������� ��������.
�����������������!

4.5. ����� ����������� ���������: putenv()

������� putenv(), ����������� � ������������ ����� stdlib.h ���������� �
������������ ���������� — ������� ������� ����������=�������� ��� ������
����������. ������ ����� ������������������ ������ �������� ���������. ����
���������� �����������, �� � ��������� ����������� ����� ������. ���� ����������
��� ����������, �� ������� �������� ����������������. ���� � �������� ���������
���������� ������ ��� ����������, �� ���������� ��������� �� ���������. � ������
�������� ����������, putenv() ���������� ���� � -1 — � ������ ������.

� ������� putenv() ���� ���� �����������: ��������� �� ������, ���������� �
�������� ���������, ���������� ������ ���������. ���� � ���������� ������ �����
��������, ����� �������� � ���������. ��� ����� ������ ������, � ������� ��
������� ��������. ���� �������� �������������� �������� ������� putenv:


int putenv (char * str);

������ ������� ���������, ������������ putenv(). ��� ���:


/* putenv.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define QUERY_MAX_SIZE		32
char * query_str;

void print_evar (const char * var)
{
	char * tmp = getenv (var);
	if (tmp == NULL)
	{
		printf ("%s is not setn", var);
		return;
	}
	printf ("%s=%sn", var, tmp);
}

int main (void)
{
	int ret;
	query_str = (char *) calloc (QUERY_MAX_SIZE, sizeof(char));
	if (query_str == NULL) abort ();

	strncpy (query_str, "FOO=foo_value1", QUERY_MAX_SIZE-1);
	ret = putenv (query_str);
	if (ret != 0) abort ();
	print_evar ("FOO");

	strncpy (query_str, "FOO=foo_value2", QUERY_MAX_SIZE-1);
	print_evar ("FOO");

	strncpy (query_str, "FOO", QUERY_MAX_SIZE-1);
	ret = putenv (query_str);
	if (ret != 0) abort ();
	print_evar ("FOO");
	
	free (query_str);
	exit (0);
}

��������� ������� ������� ���, ��� ����������� �����, ������� �������� ��� ��
�������. ������� ������� ��� �������� ������� print_evar (PRINT Environment
VARiable), ������� ����� �������� ������� ��������� ���������� ���������,
���������� � �������� ���������. � ������� main() �����-������� �������� � ����
(heap) ������ ��� ������, � ������� ����� ���������� �������; ������� �����
������ � query_str. ������ ��������� ������, � �������� ������ � �������
putenv(). ����� ��� ������ ����������. ������ ���� ������������ ����, �� ��� �
������������ ��������: ������� ��������� ����������� ������ �� ������,
����������� � query_str �������� � ��������� ���������; ��� ����� �� ������
������� print_evar(). �������, �������� putenv() �� �������, �� ����������
������� ‘=’ (�����). ��� ������ �� �������� ���������� �� ���������. �������
print_evar() ������������ ���.

���� ��������, ��� putenv() �������������� �� ����� �������� Unix. ���� ���
������� �������������, ����� ������������ setenv() ��� ����������/�����������
���������.

4.6. �������� ���������� ���������: unsetenv()

������� unsetenv(), ����������� � stdlib.h, ������� ���������� �� ���������.
���� �������� �������������� �������� ���� �������.


int unsetenv (const char * name);

������ ����� ���� �������� �������� �� ��, ��� ������ ������� unsetenv() ������
�� ��������� (void). � ������� ������ 2.2.2 ���������� glibc (������ 2001 ����)
������� ����� ���������� int.

������� unsetenv() ���������� � �������� ��������� ��� ���������� ���������.
������������ �������� — ���� ��� ������� ���������� � -1 � ������ ������.
���������� ������� ���������, ������� ������� ���������� ��������� USER (!!!).
��� ���, ��� ���������, ��������� ��� ���� ���: ������ ������� �������� �
����������� ������ ���������, ����� �� ��������� � ������� ��������� ������
���������, �� ����������� �������� ���������, ������� � ��� ���. ���� ��������
�������� ��� ���������, ����������� ������������ ��������� ��������� �������
unsetenv().


/* unsetenv.c */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gnu/libc-version.h>

#define OLD_LIBC_VERSION	0
#define NEW_LIBC_VERSION	1
#define E_VAR			"USER"

int libc_cur_version (void)
{
	int ret = strcmp (gnu_get_libc_version (), "2.2.2");
	if (ret < 0) return OLD_LIBC_VERSION;
	return NEW_LIBC_VERSION;
}

int main (void)
{
	int ret;
	char * str;
	if (libc_cur_version () == OLD_LIBC_VERSION)
	{
		unsetenv (E_VAR);
	} else
	{
		ret = unsetenv (E_VAR);
		if (ret != 0)
		{
			fprintf (stderr, "Cannot unset '%s'n", E_VAR);
			exit (1);
		}
	}

	str = getenv (E_VAR);
	if (str == NULL)
	{
		printf ("'%s' has removed from environmentn", E_VAR);
	} else
	{
		printf ("'%s' hasn't removedn", E_VAR);
	}	
	exit (0);
}

� ��������� ������� ���� �� ����� ���������� �������� ���������� ��� ��� ������
����������. ��� ������� ������������� ��� ������������ ���� ���������
unsetenv(). ������� �� ������� ��� � �������� ����������. ������� �����
� ������� (� ����� �������), �� ������� ������ �� unsetenv() ��������� ����
�������� ���������� ��� ������ getenv().

4.7. ������� ���������: clearenv()

������� clearenv(), ����������� � ������������ ����� stdlib.h, ������������
������ ����� ��� ������ ������� ���������. clearenv() �������������� �� �����
�������� Unix. ���� �������� �� ��������.


int clearenv (void);

��� �������� ���������� clearenv() ���������� ����. � ������ ������
������������ ��������� ��������.

� ����������� ������� ������ clearenv() ����� ������������ ���������
����������:


environ = NULL;



Copyright © 2003-2006, 2007 Nikolay N. Ivanov
Distributed under the GNU Free Documentaton License

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

Откройте окно переменных среды

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

Если вы хотите пропустить его чтение, один путь, который работает одинаково во всех версиях Windows, — это открыть окно «Выполнить» (Win + R), командную строку или PowerShell и выполнить команду: rundll32.exe sysdm.cpl,EditEnvironmentVariables.

Если вы хотите изменить значение существующей переменной среды, сначала выберите ее в окне «Переменные среды». Затем щелкните или коснитесь «Изменить».

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

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

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

  • setx variable_name "value", если вы хотите создать переменную среды пользователя
  • setx variable_name "value" /m, если вы собираетесь создать системную переменную среды

Например, мы набрали setx TEST "C:digitalcitizen" и создали пользовательскую переменную TEST со значением C:digitalcitizen.

Если мы хотим изменить значение переменной среды, мы можем запустить ту же команду setx, но указать новое значение для переменной. Например, выполнение setx TEST "C:DC" изменяет значение переменной среды TEST на C:DC.

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

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

ПРИМЕЧАНИЕ. Вы можете получить список всех доступных переменных среды, выполнив команду set в командной строке (не setx и без каких-либо параметров). Однако, если вы только что создали или отредактировали переменную среды, необходимо закрыть и снова открыть командную строку, чтобы изменения отобразились.

Как редактировать переменную среды из PowerShell

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

  • [Environment]::SetEnvironmentVariable("variable_name","variable_value","User"), если вы хотите создать переменную среды пользователя.
  • [Environment]::SetEnvironmentVariable(“variable_name”,”variable_value”,”Machine”), если вы хотите создать системную переменную среды.

Например, мы набрали [Environment]::SetEnvironmentVariable(“TEST”,”digitalcitizen.life”,”User”), чтобы создать переменную пользовательской среды под названием TEST со значением digitalcitizen.life. Чтобы изменить значение переменной позже, мы можем запустить ту же команду с другим значением. Как и setx в командной строке, эта команда переписывает значение указанной переменной каждый раз, когда вы ее запускаете.

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

ПРИМЕЧАНИЕ. В PowerShell вы можете получить список всех переменных среды, выполнив команду Get-ChildItem Env:. Однако, если вы только что создали или отредактировали переменную среды, вам необходимо закрыть и снова открыть PowerShell, чтобы изменения отобразились.

Как очистить значение переменной среды в Windows (из командной строки)

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

Однако вы можете очистить значение переменной среды с помощью командной строки. Чтобы отменить установку переменной среды из командной строки , введите команду setx variable_name "". Например, мы набрали setx TEST "", и эта переменная среды теперь имела пустое значение.

Далее давайте посмотрим, как удалить переменную среды.

Как удалить переменную среды в Windows

Если вы больше не хотите использовать конкретную переменную среды, выберите ее в окне «Переменные среды». Затем нажмите Удалить. Windows не запрашивает подтверждения этого действия. Поэтому, если вы передумали, необходимо нажать Отмена, чтобы удаление не применялось. Если вы хотите, чтобы удаление продолжилось, нажмите ОК .

Как удалить переменную среды из командной строки

Чтобы удалить переменную среды из командной строки , введите одну из этих двух команд в зависимости от типа этой переменной:

  • REG delete "HKCUEnvironment" /F /V "variable_name", если это переменная среды пользователя, или
  • REG delete "HKLMSYSTEMCurrentControlSetControlSession ManagerEnvironment" /F /V "variable_name", если это системная переменная среды.

Например, мы набрали REG delete "HKCUEnvironment" /F /V "TEST", и наша переменная среды TEST исчезла из профиля пользователя.

Как удалить переменную среды из PowerShell

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

  • [Environment]::SetEnvironmentVariable("variable_name", $null ,"User"), если это переменная профиля пользователя, или
  • [Environment]::SetEnvironmentVariable("variable_name", $null ,"Machine"), если это общесистемная переменная.

Например, мы набрали [Environment]::SetEnvironmentVariable("TEST", $null ,"User"), и эта переменная среды исчезла из профиля пользователя.

Это оно!

Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции

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

  • Введение
  • Как работает окружение и его переменные
  • Вывод переменных оболочки и окружения
    • Общие переменные окружения и консольной оболочки
  • Установка переменных окружения и оболочки
    • Создание переменной оболочки
    • Создание переменной окружения
  • Отвязка переменный
  • Установка переменных окружения по логину
    • Различие между логин, не-логин, интерактивной и не-интерактивной сессией оболочки
    • Реализация переменных окружения
  • Заключение

Введение

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

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

Как работает окружение и его переменные

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

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

KEY=value1:value2:...

Если значение содержит пробелы, тогда используют кавычки

KEY="value with spaces"

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

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

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

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

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

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

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

printenv
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/rgt
USER=rgt
DESKTOP_SESSION=cinnamon
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/782e62a7_614a_44c6_a444_cecbdf372225
DEFAULTS_PATH=/usr/share/gconf/cinnamon.default.path
QT_QPA_PLATFORMTHEME=qt5ct
PWD=/home/rgt
HOME=/home/rgt
SSH_AGENT_PID=1365
QT_ACCESSIBILITY=1
XDG_SESSION_TYPE=x11
XDG_DATA_DIRS=/usr/share/cinnamon:/usr/share/gnome:/home/rgt/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
XDG_SESSION_DESKTOP=cinnamon
LC_ADDRESS=ru_RU.UTF-8
LC_NUMERIC=ru_RU.UTF-8
GTK_MODULES=gail:atk-bridge
PAPERSIZE=a4
TERM=xterm-256color
SHELL=/bin/bash
VTE_VERSION=5202
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_CURRENT_DESKTOP=X-Cinnamon
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
GNOME_TERMINAL_SERVICE=:1.124
NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
XDG_SEAT=seat0
SHLVL=1
LANGUAGE=en_US
LC_TELEPHONE=ru_RU.UTF-8
GDMSESSION=cinnamon
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=rgt
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
XAUTHORITY=/home/rgt/.Xauthority
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_CONFIG_DIRS=/etc/xdg/xdg-cinnamon:/etc/xdg
PATH=/home/rgt/.gems/bin:/home/rgt/.npm-global-modules/bin:/home/rgt/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/elixir/bin:/home/rgt/.racket/bin
LC_IDENTIFICATION=ru_RU.UTF-8
PS1=$ 
SESSION_MANAGER=local/rgt-laptop:@/tmp/.ICE-unix/1301,unix/rgt-laptop:/tmp/.ICE-unix/1301
LESSOPEN=| /usr/bin/lesspipe %s
LC_TIME=en_US.UTF-8
_=/usr/bin/printenv

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

$ printenv SHELL
/bin/bash
$ printenv USER
rgt

С другой стороны env позволяет изменять окружение, указывая определение переменной. Например:

env VAR1="value VAR1" command_to_run command_option

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

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

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

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

$ set | head
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="19" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")

Вывод этой команды довольно огромен. Для удобства работы с этими переменными можно использовать пейджеры more или less.

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

(set -o posix; set)

Возникнет список всех определенных переменных окружения и оболочки.

Можно попробовать сравнить этот вывод с выводом команд env или printenv, тем самым получив список только переменных оболочки. Возможно, вывод будет довольно кривым:

comm -23 <(set -o posix; set | sort) <(env | sort)

Отображение будет до сих пор включать несколько переменных окружения, в связи с тем фактом, что set команда выводит значения в кавычках, в то время как команды printenv и env показывают значения, опуская их.

Все это должно давать правильное понимание переменных окружения и оболочки.

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

Общие переменные окружения и консольной оболочки

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

  • 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 на вывод set:

$ set | grep TEST_VAR
TEST_VAR='Hello World!'
$ bash                # создание новой дочерней сессии
$ set | grep TEST_VAR # делаем поиск переменной
$                     # вывод пуст

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

$ printenv | grep TEST_VAR
$ # вывод пуст

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

$ echo $TEST_VAR
Hello World!

Команда echo делает вывод введенной строки как аргумента. Но, в данном случае применяется знак $, в совокупности с ключом переменной, который возвращает ее значение.

Создание переменной окружения

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

$ export TEST_VAR
$ printenv | grep TEST_VAR
TEST_VAR=Hello World!

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

$ bash
$ echo $TEST_VAR
Hello World!

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

$ export NEW_VAR="Testing export"
$ printenv | grep NEW_VAR
NEW_VAR="Testing export"
$ exit # делаем выход из текущего процесса и возвращаемся в родительский
$ echo $NEW_VAR
$ # ничего

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

Отвязка переменный

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

$ export -n TEST_VAR

Теперь, если посмотреть в окружение, то удаленная переменная там будет отсутствовать.

$ printenv | grep TEST_VAR

При этом она до сих пор существует в переменной оболочки:

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

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

$ unset TEST_VAR

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

$ echo $TEST_VAR

Отсутствует какое-либо возвращаемое значение, потому что переменная была отвязана.

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

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

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

Различие между логин, не-логин, интерактивной и не-интерактивной сессией оболочки

Bash оболочка читает различные конфигурационные файлы в зависимости от того, какая сессия запущена.

Логин-сессия оболочки запускается по аутентификации пользователя. Если пользователь входит в сессию терминала или через SSH и аутентифицируется, тогда эта сессия оболочки будет определена как логин-оболочка.

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

Помимо этих типов сессий, существуют интерактивный и не-интерактивный подход. Первый прикрепляется к терминалу, второй же — наоборот.

Таким образом сессии оболочки могут различаться по этим двум типам.

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

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

Логин сессия при запуске в первую очередь будет читать конфигурационные заявления из файла /etc/profile. Затем она будет смотреть данные в первом конфигурационном файле и пользовательской домашней директории, чтобы получить особые настройки пользователя.

Читаются исключительно файлы, которые располагаются в ~/.bash_profile, ~/.bash_login и ~/.profile.

В не-логин сессии оболочка читает файл /etc/bash.bashrc и пользовательский ~/.bashrc файл для построения своего окружения.

Не-интерактивные оболочки читают переменную окружения под названием BASH_ENV и читают указанный файл, чтобы определить новое окружение.

Реализация переменных окружения

Как можно увидеть выше, существуют различные отдельные файлы для настроек.

Это обеспечивает гибкость, которая может помочь в особых ситуациях, где будут необходимы конкретные настройки для логин и не-логин оболочки. Хотя, обычно, настройки одинаковы в обоих ситуациях.

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

Обычно в конфигурациях указываются особые переменные окружения для пользовательских нужд. Эти настройки указываются в ~/.bashrc файле.

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

export VARNAME=value

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

$ source ~/.bashrc

Если необходимо установить системные переменные, то можно добавить их в /etc/profile, /etc/bash.bashrc или /etc/environment.

Заключение

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

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

Статья была переведена отсюда.

Состояние перевода: На этой странице представлен перевод статьи Environment variables. Дата последней синхронизации: 26 октября 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Переменная окружения — именованный объект, содержащий текстовую информацию, которую могут использовать запускаемые программы. Проще говоря, это переменная с именем и значением. Значением такой переменной может быть, например, место размещения исполняемых файлов в системе, имя предпочитаемого текстового редактора или настройки системной локали. Новые в Linux пользователи часто находят такой способ хранения настроек неудобным. Однако переменные окружения позволяют простым и надёжным способом передавать настройки сразу для множества приложений.

Утилиты

Пакет coreutils содержит программы printenv и env. Программа printenv позволяет отобразить список текущих переменных окружения:

$ printenv

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

Программа env может быть использована для запуска команд с указанием нового значения переменной окружения. В следующем примере будет запущен xterm, для которого переменная окружения EDITOR имеет значение vim. Такой вызов не затронет переменную окружения EDITOR в текущем сеансе терминала.

$ env EDITOR=vim xterm

Встроенная в командную оболочку команда set(1p) позволяет вам устанавливать значения переменных окружения в текущем сеансе терминала, а также отображать имена и значения переменных окружения текущего сеанса.

Чтобы увидеть переменные окружения конкретных процессов, откройте файл /proc/pid/environ, где pid — числовой идентификатор интересующего процесса. Записи в этом файле отделены друг от друга нулевым байтом (x0), который обычно не виден в терминале. Вы можете использовать, например, sed для отображения переменных окружения процесса в более читабельном формате, заменив нулевые байты на переносы строки: sed 's:x0:n:g' /proc/$PID/environ

Установка переменных

На системном уровне

Большинство дистрибутивов Linux советуют изменять или добавлять переменные окружения в /etc/profile или других местах. Имейте в виду, что сразу множество файлов могут содержать переменные окружения и переопределять их, вроде /etc/locale.conf. По сути, любой скрипт может быть использован для этого, однако по принятым в UNIX соглашениям следует использовать для этого только определённые файлы.

Для установки переменных окружения на уровне всей системы можно использовать следующие файлы (каждый со своими ограничениями):

  • /etc/environment используется модулем pam_env. Он не привязан к командным оболочкам, поэтому скрипты или glob-выражения использовать здесь нельзя. Здесь можно указывать только пары имя=значение.
  • /etc/profile устанавливает переменные только в оболочках входа (когда пользователь выполняет вход в систему). В нём можно запускать скрипты и он может использоваться в оболочках, совместимых с Bourne shell.
  • Файлы настроек, специфичные для конкретных командных оболочек — глобальные файлы для вашей командной оболочки, инициализирует переменные и запускает скрипты. Например, Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.

Ниже приведён пример скрипта, который создаёт функцию для добавления нескольких каталогов (например, ~/bin и ~/scripts) в PATH. Чтобы это сделать, просто поместите код в один из системных файлов инициализации окружения (/etc/profile или /etc/bash.bashrc):

set_path(){

    # Проверяем, что id пользователя 1000 или больше
    [ "$(id -u)" -ge 1000 ] || return

    for i in "$@";
    do
        # Проверяем существование каталога
        [ -d "$i" ] || continue

        # Проверяем, что его ещё нет в $PATH.
        echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue

        # Затем добавляем в $PATH и экспортируем переменную
        export PATH="${PATH}:$i"
    done
}

set_path ~/bin ~/scripts

На уровне пользователя

Не всегда требуется устанавливать переменные окружения на уровне системы. Например, вы можете добавить ваш каталог /home/пользователь/bin в PATH, однако не хотите, чтобы это затрагивало других пользователей системы. Переменные окружения пользователя можно устанавливать во многих других файлах:

  • Файлы инициализации командной оболочки, например Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы Запуска/Завершения.
  • Пользовательские переменные окружения systemd считываются из файлов ~/.config/environment.d/*.conf.

Например, чтобы добавить каталог в PATH, поместите следующее в ~/.bash_profile:

export PATH="${PATH}:/home/пользователь/bin"

Для применения изменений перезайдите в командную оболочку или используйте команду source: $ source ~/.bash_profile.

Примечание: Демон dbus и пользовательский экземпляр systemd не наследуют никакие переменные окружения из мест вроде ~/.bashrc. Это означает, что, например, активируемые через dbus программы вроде Gnome Files не будут использовать их по умолчанию. Смотрите systemd/Пользователь#Переменные окружения.

Графические приложения

Если переменная окружения влияет только на графические приложения, можно ограничить область её применения, установив её только в рамках графического сеанса.

Чтобы установить переменные окружения только для определённого приложения вместо целого сеанса, измените .desktop файл этого приложения. Смотрите Ярлыки приложений#Изменение переменных окружения.

Использование скрипта запуска

Некоторые графические окружения (например, KDE Plasma), поддерживают запуск скриптов при входе: можно использовать их для установки переменных окружения. Пример есть в статье KDE (Русский)#Автозапуск приложений.

Окружение Xorg

Установка переменных окружения для сеанса Xorg зависит от того, каким конкретно способом он запускается:

  • Большинство экранных менеджеров выполняют source файла xprofile.
  • startx и SLiM выполняют xinitrc.
  • XDM выполняет ~/.xsession; смотрите XDM (Русский)#Определение сеанса.
  • SDDM дополнительно выполняет source скриптов оболочек входа, вроде ~/.bash_profile для bash или ~/.zprofile и ~/.zlogin для zsh. [1]

Хотя конец скрипта зависит от того, какой это файл, а любой расширенный синтаксис зависит от используемой оболочки, базовое использование универсально:

~/.xprofile, ~/.xinitrc или ~/.xsession
...
export ПЕРЕМЕННАЯ=значение
...
Окружение Wayland

Так как Wayland не использует Xorg-специфичные файлы, GDM и KDE Plasma вместо них загружают пользовательские переменные окружения systemd.

~/.config/environment.d/envvars.conf
ПЕРЕМЕННАЯ=значение

Другие экранные менеджеры (например, SDDM) пока что не поддерживают это. Однако SDDM выполняет source скриптов оболочек входа и для сеансов Wayland тоже.

На уровне сеанса

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

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

$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"

С помощью pam_env

PAM-модуль pam_env(8) загружает переменные для прописывания в окружение из этих файлов в указанном порядке: /etc/security/pam_env.conf и /etc/environment.

Примечание:

  • Эти файлы считываются перед другими файлами, в частности перед ~/.profile, ~/.bash_profile и ~/.zshenv.
  • Устаревший файл ~/.pam_environment больше не считывается. Смотрите FS#68945.

/etc/environment должен содержать только простые пары вида ПЕРЕМЕННАЯ=значение на отдельных строках, например:

EDITOR=nano

/etc/security/pam_env.conf имеет формат:

ПЕРЕМЕННАЯ [DEFAULT=значение] [OVERRIDE=значение]

@{HOME} и @{SHELL} являются специальными переменными, значение которых берётся из /etc/passwd. Следующий пример показывает, как использовать переменную HOME внутри другой переменной:

XDG_CONFIG_HOME   DEFAULT=@{HOME}/.config

Примечание: Переменные ${HOME} и ${SHELL} не связаны с переменными окружения HOME и SHELL, по умолчанию они не задаются.

Формат также позволяет расширить уже определённые переменные значениями из других переменных с помощью ${ПЕРЕМЕННАЯ} , например:

GOPATH DEFAULT=${XDG_DATA_HOME}/go

Пары ПЕРЕМЕННАЯ=значение тоже допускаются, но расширение переменных здесь не поддерживается. Подробнее смотрите pam_env.conf(5).

Примеры

В этом разделе описываются типовые переменные окружения, используемые в Linux.

  • XDG_CURRENT_DESKTOP — это переменная freedesktop.org, содержащая список разделённых двоеточиями строк, которыми идентифицируется среда рабочего стола [2]. Стандартные значения — GNOME, GNOME-Flashback, KDE, LXDE, LXQt, MATE, TDE, Unity, XFCE, EDE, Cinnamon и Pantheon [3].
    • Cinnamon был зарегистрирован позже других сред. В итоге некоторые приложения по-прежнему ожидают старое нестандартное значение X-CINNAMON, например Qt [4].
  • XDG_SESSION_DESKTOP похожа на XDG_CURRENT_DESKTOP, но допускает использование только одной строки. Несмотря на название, переменная не входит в стандарт freedesktop.org.
  • DE — более старая переменная для обозначения текущей среды рабочего стола (Desktop Environment). Её значения не стандартизированы, но можно ориентироваться на xdg-utils как на справочник типовых значений для многих сред рабочего стола.
  • DESKTOP_SESSION — ещё одна старая переменная, но используется реже, чем DE. Значение также может быть путём к файлу .desktop сеанса в каталоге /usr/share/xsessions/ [5].
  • WINDOW_MANAGER — переменная, иногда используемая для выбора оконного менеджера, который будет использоваться в среде рабочего стола. Это отличает её от других упомянутых здесь переменных, которые устанавливаются уже выбранным экранным менеджером или средой рабочего стола и используется для чтения другими программами.
  • PATH содержит список каталогов, разделённых двоеточиями, в которых система ищет исполняемые файлы. Когда обычная команда (например, ls, systemctl или pacman) интерпретируется командной оболочкой (например, bash или zsh), оболочка ищет исполняемый файл с указанным именем в каталогах из этого списка и, если находит, запускает файл, передав ему указанные аргументы командной строки. Чтобы запускать исполняемые файлы, пути к которым не находятся в PATH, необходимо указывать относительный или абсолютный путь к файлу, например ./a.out или /bin/ls.

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

  • HOME содержит путь к домашнему каталогу текущего пользователя. Эта переменная может использоваться приложениями для определения расположения файлов настроек пользователя, который их запускает.
  • PWD содержит путь к текущему рабочему каталогу.
  • OLDPWD содержит путь к предыдущему рабочему каталогу, то есть, значение PWD перед последним вызовом cd.
  • TERM содержит тип запущенного терминала, например xterm-256color. Это используется некоторыми программами, которые хотят знать возможности текущего терминала.
  • MAIL содержит путь к каталогу, где сохраняется входящая почта. Обычно имеет значение /var/spool/mail/$LOGNAME.
  • ftp_proxy и http_proxy содержат адреса прокси-серверов для протоколов FTP и HTTP соответственно:
ftp_proxy="ftp://192.168.0.1:21"
http_proxy="http://192.168.0.1:80"
  • MANPATH содержит разделённый двоеточиями список каталогов, которые использует man для поиска man-страниц.

Примечание: В /etc/profile есть комментарий «Man is much better than us at figuring this out», так что эту переменную обычно стоит не задавать. Смотрите manpath(5).

  • INFODIR содержит разделённый двоеточиями список каталогов, которые использует info для поиска info-страниц, например /usr/share/info:/usr/local/share/info.
  • TZ может использоваться для установки временной зоны. Можно ссылаться на файл из /usr/share/zoneinfo/, например TZ=":/usr/share/zoneinfo/Europe/Moscow", тогда перед путём к файлу должно стоять двоеточие (смотрите документацию GNU).

Программы по умолчанию

  • SHELL содержит путь к предпочитаемой командной оболочке текущего пользователя. Имейте в виду, что это не обязательно совпадает с текущей работающей оболочкой. Если значение не указано, Bash автоматически устанавливает в качестве её значения оболочку входа, прописанную в файле /etc/passwd, или /bin/sh, если это не удаётся определить.
  • PAGER указывает команду для запуска программы постраничного просмотра содержимого текстовых файлов, например, /bin/less.
  • EDITOR содержит команду для запуска программы для редактирования текстовых файлов, например /usr/bin/nano. Также можно задать специальную команду, которая будет выбирать редактор в зависимости от окружения, например, gedit в X или nano в терминале, как в этом примере:
[ -n "$DISPLAY" ] && export EDITOR=gedit || export EDITOR=nano
  • VISUAL позволяет указать имя продвинутого текстового редактора для более сложных задач, например, редактирования почты. Это могут быть vi, vim, emacs и т. д.
  • BROWSER содержит команду для запуска веб-браузера. Может быть полезно устанавливать это значение в зависимости от наличия графического окружения:
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links

Совет: При прописывании программ по умолчанию также можно ориентироваться на переменную WAYLAND_DISPLAY, наличие которой указывает на то, что запущен Wayland-композитор.

Смотрите также

  • Gentoo:Handbook:X86/Working/EnvVar
  • Ubuntu Community Wiki — Environment Variables

If you’ve been using Linux for a while, you may be wondering how to set certain parameters from the command line that can keep your settings across programs. Environment variables are how you do this.

By the end, you’ll have a deep understanding of what environment variables are, and how you can create such variables from the command line.

What Are Environment Variables?

Environment variables are variables meant to be consistent across all instances of the Linux shell. When you launch a program from the shell, it makes a copy of itself, or «forks,» and then replaces itself with the program it’s going to run, known as «exec.»

Environment variables will be inherited in any copies of the shell that the shell spawns, also known as «exporting» variables. Even Windows uses environment variables, going back to the days of MS-DOS, but in modern times, most programs rely on the Registry and their own settings menus for configuration.

An environment variable might define your favorite editor, so when a program launches the text editor to change a configuration file, this editor will come up every time.

Environment variables can be set system-wide by the system administrator, but it’s more common for them to be defined in startup files for individual users. By convention, they’re printed in upper case and are indicated by a leading «$» sign, such as «$EDITOR» for the default text editor.

Listing Environment Variables

To see the value of any environment variable, use the echo command. For example, to view the value of the variable $EDITOR, run the following command:

 echo $EDITOR 

If it’s set, the shell will print the value, such as «vim», but if it’s empty, it will just print a blank line.

To see all the currently set environment variables, type «set» at the command line.

running the set command

Setting Environment Variables on Linux

You can set environment variables in two ways: from the command line or in shell configuration files.

The first method is simple. In Bash, you use the «export» command. For example, to set the $EDITOR environment variable:

 export EDITOR='vim' 

Note that in this syntax, you omit the leading «$«. You can also use VARIABLE=’value’, but that will just extend to that particular instance of the shell, meaning the shell will reset the changed value once you close the terminal.

Now your editor will be Vim or whatever text editor you have in this session and every subshell it launches. If you want to keep your environment variables among different shell sessions, define them in your shell’s startup files.

Bash reads several files on startup: /etc/profile, /etc/bash/bashrc, .bash_profile, and .bashrc. The first two are system-wide and only a system administrator can modify those, while the rest reside in your home directory.

The .bashrc file is what you want to edit, as it affects interactive shells, whether it’s running as a login shell or not. If you’re using the shell from a terminal emulator, .bashrc is what will get read.

The method of setting environment variables in a file is the same as setting it at the command line. Just append the export VARIABLE=’value’ command to the shell configuration file. When you’re finished, save the file and launch a new shell.

Note that Linux users can also change the default shell from Bash to some other shell. For those who have, you’ll have to edit your shell’s configuration file instead of .bashrc, which is the config file for Bash.

Now You Know How Environment Variables Work

With environment variables, you can have consistent settings across all your shell sessions. Shell variables are an important part of shell scripting, something every Linux user should know about.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • 480а11 ошибка бмв
  • 480db3 ошибка бмв
  • 480db1 bmw ошибка
  • 480db0 ошибка бмв
  • 480c02 ошибка бмв

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии