Переменные окружения в Linux - это специальные переменные, определенные оболочкой и используемые программами во время выполнения. Они могут определяться системой и пользователем. Системные переменные окружения Linux определяются системой и используются программами системного уровня.
Например, команда PWD использует системную переменную, чтобы сохранять прежнюю рабочую директорию. Пользовательские переменные окружения устанавливаются пользователем, для текущей оболочки, временно или постоянно. Вся концепция добавления и удаления переменных оболочки крутится вокруг нескольких файлов, команд и различных оболочек.
Содержание статьи
- Виды переменных окружения
- Конфигурационные файлы переменных окружения Linux
- Добавление пользовательских и системных переменных окружения в Linux
- Создание пользовательских и системных переменных окружения
- Установка и удаление пользовательских переменных
- Установка и удаление системных переменных окружения
- Выводы
Виды переменных окружения
Если смотреть более широко, переменная окружения может быть трех типов:
1. Локальные переменные окружения
Эти переменные определены только для текущей сессии. Они будут безвозвратно стерты после завершения сессии, будь то удаленный доступ или эмулятор терминала. Они не хранятся ни в каких файлах, а создаются и удаляются с помощью специальных команд.
2. Пользовательские переменные оболочки
Эти переменные оболочки в Linux определяются для конкретного пользователя и загружаются каждый раз когда он входит в систему при помощи локального терминала, или же подключается удаленно. Такие переменные, как правило, хранятся в файлах конфигурации: .bashrc, .bash_profile, .bash_login, .profile или в других файлах, размещенных в директории пользователя.
3. Системные переменные окружения
Эти переменные доступны во всей системе, для всех пользователей. Они загружаются при старте системы из системных файлов конфигурации: /etc/environment, /etc/profile, /etc/profile.d/ /etc/bash.bashrc.
Конфигурационные файлы переменных окружения Linux
Здесь мы кратко рассмотрим различные конфигурационные файлы, перечисленные выше, которые используются для настройки переменных окружения для всей системы или конкретного пользователя.
.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
Другой способ создать переменную - команда export. Удалим ее присвоив пустое значение:
export VAR='Losst'
echo $VAR
VAR=
echo $VAR
Теперь создадим переменную VAR2 также зададим ей значение. А потом временно удалим все локальные переменные выполнив env -i. Она запустит оболочку без каких-либо переменных. После ввода exit все переменные будут восстановлены.
VAR2='Losst'
echo $VAR2
env -i bash
echo $VAR2
Установка и удаление пользовательских переменных
Отредактируйте файл .bashrc, в вашей домашней директории, добавив команду export, для экспортирования нужной переменной. Затем выполните команду source для применения изменений. Создадим, например, переменную CD:
vi .bashrc
Добавьте такую строчку (o, затем вставить, затем Esc и :wq):
Теперь осталось обновить конфигурацию:
source .bashrc
echo $CD
Для удаления этой переменной просто удалите ее из .bashrc.
Теперь добавим переменную окружения с помощью .bash_profile. Эта переменная, как вы уже знаете будет доступна только при удаленном входе:
vi .bash_profile
Добавьте строчку:
И выполните эти команды, чтобы применить изменения и проверить добавление переменной:
source .bash_profile
echo $VAR2
Переменная недоступна, так как вы создали локальную терминальную сессию, теперь подключитесь по ssh:
ssh user@localhost
echo $VAR2
Удалить эту переменную окружения можно так же как и в предыдущем случае, удалив ее из файла.
Замечание: Эти переменные доступны всегда, но не для всех пользователей.
Установка и удаление системных переменных окружения
Создадим переменную, доступную для всех пользователей, во всех терминальных сессиях, кроме удаленных, добавлением ее в /etc/bash.profile:
vi /etc/bash.profile
Затем обновляем:
source /etc/bash.bashrc
Теперь эта переменная доступна для всех пользователей, во всех терминалах:
echo $VAR
sudo su
echo $VAR
su -
echo $VAR
Если вы хотите сделать переменную окружения доступной для всех пользователей, которые подключаются к этой машине удаленно, отредактируйте файл /etc/profile:
vi /etc/profile
Обновите конфигурацию, и проверьте доступность переменной, она будет доступна только удаленно:
source /etc/profile
echo $VAR1
Если нужно добавить переменную окружения в Linux, так чтобы она была доступна и удаленно, и для локальных сессий, экспортируйте ее в /etc/environment:
vi /etc/environment
Проверяем:
source /etc/environment
echo $VAR12
sudo su
echo $VAR12
exit
ssh localhost
echo $VAR12
Как видите, переменная доступна и для локальных пользователей и удаленно.
Выводы
С помощью этих нескольких способов мы можем изменить переменные окружения. Если вы знаете другие интересные способы это сделать, поделитесь в комментариях!
/etc/profile
"Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно..."
А что значит вошел удаленно? Через SSH?
Да.
Написанное справедливо для всех современных дистрибутивов?
Здравствуйте! Скажите можно ли запускать видео на 2-м мониторе добавив переменную в ./bashrc к примеру:
env DISPLAY=0:1 totem (ну или другой проигрыватель)?
или лучше использовать:
export DISPLAY=0:1 totem
Думаю: лучше env -i DISPLAY=0:1 totem в ~/.xinputrc, только вот с totem'ом могут быть те ещё грабли - тут уже не подскажу...а вот если там же, в ~/.xinputrc, будет export DISPLAY=0:1, то это подействует и на X-сервер. Ну, и ваше export DISPLAY=0:1 totem - это уже ошибка, тогда уж в две строки:
export DISPLAY=0:1
totem
Но, totem будет запускаться вместе с x-сервером...может проще создать alias с env в ~/.bashrc? А может в totem есть ещё какие опции, как, например, в mplayer -display?
"... добавлением ее в /etc/bash.profile
...
Затем обновляем:
source /etc/bash.bashrc"
я думал обновлять надо отредактированный файл, или это опечатка?
Позволю себе добавить к вышесказанному:
VAR=1 # переменная видна только для ТЕКУЩЕГО процесса
$VAR
>> 1: команда не найдена
set | grep VAR # set без параметров отобразит ВСЕ (как локальные так и глобальные) переменные
>> VAR=1
env | grep VAR
>>
bash # запустим дочерний процесс
$VAR # наша переменная в нем не видна
>>
exit # выходим
$VAR # переменная сохранилась в родительском процессе
>> 1: команда не найдена
VAR=2 bash # установим переменную для дочернего процесса
$VAR # она видна в дочернем процессе
>> 2: команда не найдена
set | grep VAR # так же видна в set
>> VAR=2
exit # закрываем дочерний процесс
$VAR # в родительском процессе хранится свой экземпляр переменной
>> 1: команда не найдена
unset VAR
$VAR
>> # значение переменной сброшено
export VAR=3 # переменная видна в ТЕКУЩЕМ и ДОЧЕРНИХ процессах
$VAR
>> 3: команда не найдена
set | grep VAR
>> VAR=3
env | grep VAR
>> VAR=3
printenv | grep VAR
>> VAR=3
bash # запускаем дочерний процесс
env | grep VAR
$VAR # переменная доступна
>> 3: команда не найдена
VAR=2 # можем изменить ее значение
$VAR
>> 2: команда не найдена
unset VAR # сбросим значение
$VAR
>> # переменная не определена
exit
$VAR
>> 3: команда не найдена # родительский процесс хранит значение переменной после сброса в дочернем
env | grep VAR
>> VAR=3
"Системный файл profile. Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно. Но они не будут доступны, при создании локальной терминальной сессии, то есть если вы просто откроете терминал." – неверно. Переменная будет доступна везде: в терминале, GUI программах, не важно. Только что проверял локально.
Пытался разобраться в этом вопросе, и мне кажется что вы не совсем правы.Во первых есть нюансы выполнения данного скрипта поэтому результат может несколько отличаться для Ubuntu Debian Arch & Centos. Столкнулся с обсуждением данного вопроса здесь https://devacademy.ru/article/razbiraiemsia-s-failami-etc-profile-i-etc-bashrc
и здесь англ. https://bencane.com/2013/09/16/understanding-a-little-more-about-etcprofile-and-etcbashrc/
процитирую:
"В Linux имеется два типа стартовых оболочек (login shells) - Интерактивные оболочки и Неинтерактивные оболочки. Интерактивная оболочка используется, когда пользователь может взаимодействовать с оболочкой, т.е., например, типичное приглашение командной строки bash. Неинтерактивная оболочка используется, когда пользователь не может взаимодействовать с оболочкой, т.е. выполнение bash-сценариев.
Разница проста: файл /etc/profile выполняется только для интерактивных оболочек, а файл /etc/bashrc – как для интерактивных, так и для неинтерактивных. Как правило, если вы вводите свой пароль в текстовом режиме (например, на текстовой консоли или удаленно с помощью ssh), то shell вы получаете логин shell. Однако, если вы вводите свой пароль в графической программе и входите в графическую среду, это обходит обычный логин shell. Чтение .profile в этом случае зависит от того, как настроен графический сеанс; например, он варьируется между распределениями Linux, между дисплейными менеджерами и между окружениями рабочего стола. Иногда одна из программ в цепочке явно вызывает логин shell; иногда одна из program явно читает ~/.профиль; а иногда ничего этого не происходит и ~/.профиль не читается. "
Поэтому поведение еще зависит и от системы. Для моего Debian все происходит так, вошел в систему через графическую оболочку, запустил Терминал переменных окружения нет, в этой же консоли залогинился заново под этим же пользователем ( i mean su - UserName) или под другим но с вводом пароля переменные окружения считываются, т.е. Если в консоли пароль вводился, файлы в /etc/profile.d/ отработались(принудительный логин,ssh, все что требует ввода пароля в консоли), если не вводился то этих переменных окружения не будет.
Но здесь есть особенности настройки именно в вашей ОС, они могут немного отличаться
Уровень маскировки - seriyyy95@seriyyy95-pc 😀
Нужна консультация "чайнику".
Centos.
Stunnel 5.59 Compiled/running with OpenSSL 1.1.1d 10 Sep 2019. (стартует под root)
Хотя root работает OpenSSL 1.0.2k , а под пользователем OpenSSL 1.1.1d
Apache 2.4.6
После обновления Apache до версии 2.4.48 или 2.4.49 Stunnel работает до перезагрузки.
После перезапуск Stunnel "ругается": /usr/local/bin/stunnel: relocation error: usr/local/bin/stunnel: symbol MD4_Update, version OPENSSL_1_1_0 not defined in file libcrypto.so.1.1 with link time reference
по аналогии с Windows искал решения в переменных окружения (что-то наверное "сбилось"), но так и не нашел вариантов.
E-mail: of@tut.by
Привет всем. А какая переменная отвечает за заголовок терминала? например PS1 отвечает за первое приглашение, а вот про заголовок окна терминала, что-то я не нашёл? или какими командами можно изменить этот самый заголовок? всем удачи.
Помогите пж упростить такое
Писал для скрипта в массиве проходит по значениям с индексами 1-4..8-12…. И убирает дубликаты и записывает в новый массив {diff}
Это проверка равенства переменных для 4-х значений
Я просто в этом не очень понимаю
if
[[ "${list[$a]}" != "${list[$b]}" ]] &&
[[ "${list[$a]}" != "${list[$c]}" ]] &&
[[ "${list[$a]}" != "${list[$d]}" ]] &&
[[ "${list[$b]}" != "${list[$c]}" ]] &&
[[ "${list[$b]}" != "${list[$d]}" ]] &&
[[ "${list[$c]}" != "${list[$d]}" ]]
then
diff+=("${list[$a]}")
diff+=("${list[$b]}")
diff+=("${list[$c]}")
diff+=("${list[$d]}")
else
if
[[ "${list[$a]}" == "${list[$b]}" ]] &&
[[ "${list[$a]}" != "${list[$c]}" ]] &&
[[ "${list[$a]}" != "${list[$d]}" ]] &&
[[ "${list[$b]}" != "${list[$c]}" ]] &&
[[ "${list[$b]}" != "${list[$d]}" ]] &&
[[ "${list[$c]}" != "${list[$d]}" ]]
then
diff+=("${list[$a]}")
diff+=("${list[$c]}")
diff+=("${list[$d]}")
else
if
[[ "${list[$a]}" != "${list[$b]}" ]] &&
[[ "${list[$a]}" == "${list[$c]}" ]] &&
[[ "${list[$a]}" != "${list[$d]}" ]] &&
[[ "${list[$b]}" != "${list[$c]}" ]] &&
[[ "${list[$b]}" != "${list[$d]}" ]] &&
[[ "${list[$c]}" != "${list[$d]}" ]]
then
diff+=("${list[$a]}")
diff+=("${list[$b]}")
diff+=("${list[$d]}")
else
if
[[ "${list[$a]}" != "${list[$b]}" ]] &&
[[ "${list[$a]}" != "${list[$c]}" ]] &&
[[ "${list[$a]}" == "${list[$d]}" ]] &&
[[ "${list[$b]}" != "${list[$c]}" ]] &&
[[ "${list[$b]}" != "${list[$d]}" ]] &&
[[ "${list[$c]}" != "${list[$d]}" ]]
then
diff+=("${list[$a]}")
diff+=("${list[$b]}")
diff+=("${list[$c]}")
else
if
[[ "${list[$a]}" != "${list[$b]}" ]] &&
[[ "${list[$a]}" != "${list[$c]}" ]] &&
[[ "${list[$a]}" != "${list[$d]}" ]] &&
[[ "${list[$b]}" == "${list[$c]}" ]] &&
[[ "${list[$b]}" != "${list[$d]}" ]] &&
[[ "${list[$c]}" != "${list[$d]}" ]]
then
diff+=("${list[$a]}")
diff+=("${list[$b]}")
diff+=("${list[$d]}")
else
if
[[ "${list[$a]}" != "${list[$b]}" ]] &&
[[ "${list[$a]}" != "${list[$c]}" ]] &&
[[ "${list[$a]}" != "${list[$d]}" ]] &&
[[ "${list[$b]}" != "${list[$c]}" ]] &&
[[ "${list[$b]}" == "${list[$d]}" ]] &&
[[ "${list[$c]}" != "${list[$d]}" ]]
then
diff+=("${list[$a]}")
diff+=("${list[$b]}")
diff+=("${list[$c]}")
else
if
[[ "${list[$a]}" != "${list[$b]}" ]] &&
[[ "${list[$a]}" != "${list[$c]}" ]] &&
[[ "${list[$a]}" != "${list[$d]}" ]] &&
[[ "${list[$b]}" != "${list[$c]}" ]] &&
[[ "${list[$b]}" != "${list[$d]}" ]] &&
[[ "${list[$c]}" == "${list[$d]}" ]]
then
diff+=("${list[$a]}")
diff+=("${list[$b]}")
diff+=("${list[$c]}")
fi
fi
fi
fi
fi
fi
fi