Linux export env from file

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

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

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

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

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

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 созданные с помощью этих файлов, могут быть удаленны всего лишь удалением их оттуда. Только после каждого изменения, нужно либо выйти и зайти в систему, либо выполнить эту команду:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Почему не активируется windows 10 pro

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

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

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:

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

export CD=’This is Losst Home’

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

source .bashrc
echo $CD

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

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

export VAR2=’This is Losst Home’

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

source .bash_profile
echo $VAR2

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

ssh user@localhost
echo $VAR2

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

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

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

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

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

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

echo $VAR
sudo su
echo $VAR
su —
echo $VAR

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

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

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

source /etc/profile
echo $VAR1

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

export VAR12=’I am available everywhere’

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

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

Выводы

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

Оцените статью:

Об авторе

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

11 комментариев

/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
>> # значение переменной сброшено

Читайте также:  Запустить счетчики производительности windows server

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 программах, не важно. Только что проверял локально.

/.профиль; а иногда ничего этого не происходит и

/.профиль не читается. »
Поэтому поведение еще зависит и от системы. Для моего Debian все происходит так, вошел в систему через графическую оболочку, запустил Терминал переменных окружения нет, в этой же консоли залогинился заново под этим же пользователем ( i mean su — UserName) или под другим но с вводом пароля переменные окружения считываются, т.е. Если в консоли пароль вводился, файлы в /etc/profile.d/ отработались(принудительный логин,ssh, все что требует ввода пароля в консоли), если не вводился то этих переменных окружения не будет.
Но здесь есть особенности настройки именно в вашей ОС, они могут немного отличаться

Уровень маскировки — seriyyy95@seriyyy95-pc 😀

Источник

Задать переменные среды из файла

Я пишу скрипт в bash, который анализирует файлы с 3 переменными в определенной папке, это один из них:

этот файл хранится в ./ conf / prac1

мой скрипт minientrega.sh затем анализирует файл с помощью этого кода:

но когда я выполнить minientrega.sh prac1 в командной строке он не устанавливает переменные среды

Я также попытался с помощью source ./conf/ но та же проблема по-прежнему применяется

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

19 ответов

проблема с вашим подходом является export на while цикл происходит в суб-оболочке, и эта переменная не будет доступна в текущей оболочке (родительская оболочка цикла while).

добавить в самом файле:

тогда вам нужно источник в файле в текущей оболочке, используя:

это может быть полезно:

причина, почему я использую это, если я хочу проверить .env материал в моей консоли rails.

gabrielf придумал хороший способ сохранить переменные локальными. Это решает потенциальную проблему при переходе от проекта к проекту.

я протестировал это с bash 3.2.51(1)-release

обновление:

игнорировать строки, начинающиеся с # используйте этот (спасибо Пит):

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

обновление:

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

в системах GNU или:

на системах BSD.

-o allexport позволяет экспортировать все следующие определения переменных. +o allexport отключает эту функцию.

Если env.txt как:

на allexport опция упоминается в нескольких других ответах здесь, для которых set -a — это ярлык. Источник .env действительно лучше, чем цикл по строкам и экспорт, потому что он допускает комментарии, пустые строки и даже переменные среды, генерируемые командами. Мой. bashrc и включает в себя следующее:

вот еще sed решение, которое не запускает eval или не требует ruby:

это добавляет экспорт, сохраняя комментарии к строкам, начинающимся с комментария.

.env contents

образца

я нашел это особенно полезно при создании такого файла для загрузки в файл блока systemd, с EnvironmentFile .

Это позволит сохранить/восстановить исходные параметры, какими бы они ни были.

используя set -o allexport имеет преимущество правильного пропуска комментариев без регулярного выражения.

set +o сам по себе выводит все ваши текущие параметры в формате, который bash может позже выполнить. Также удобно: set -o сам по себе, выводит все ваши текущие параметры в удобном для человека формате.

Читайте также:  Installer для windows 10 можно ли удалить

Я ввел ответ user4040650, потому что он прост, и он позволяет комментарии в файле (т. е. строки, начинающиеся с#), что очень желательно для меня, так как комментарии, объясняющие переменные, могут быть добавлены. Просто переписываю в контексте первоначального вопроса.

Если скрипт callled как указано: minientrega.sh prac1 , тогда minientrega.sh мог бы:

следующее было извлечено из набор документации:

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

set [—abefhkmnptuvxBCEHPT] [- o option-name] [аргумент . ] set [+abefhkmnptuvxBCEHPT] [+o option-name] [аргумент . ]

Если параметры или аргументы не указаны, set отображает имена и значения всех оболочек переменные и функции, отсортированный по текущей локали, в формат, который может быть использован в качестве входного для установки или сброса в настоящее время-набор переменных. Переменные только для чтения не могут быть сброшены. В POSIX mode, перечислены только переменные оболочки.

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

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

использование ‘ + ‘вместо’ — ‘ приводит к отключению этих параметров. Этот опции также могут использоваться при вызове оболочки. Текущий набор из вариантов можно найти в$ -.

улучшение ответа Сайласа Павла

экспорт переменных в подрешетке делает их локальными для команды.

(export $(cat .env | xargs) && rails c)

  1. захватить содержимое файла
  2. удалите все пустые строки (просто incase вы отделили некоторые вещи)
  3. удалить любые комментарии (просто incase вы добавили некоторые. )
  4. добавить export ко всем строкам
  5. eval все

eval $(cat .env | sed -e /^$/d -e /^#/d -e ‘s/^/export /’)

другой вариант (вам не придется бегать eval (спасибо @Jaydeep)):

наконец, если вы хотите сделать свою жизнь очень простой, добавьте это в свой

(УБЕДИТЕСЬ, ЧТО ВЫ ПЕРЕЗАГРУЗИТЕ НАСТРОЙКИ BASH. source

/.bash_profile или.. просто сделать новую вкладку/Окно и проблема решена) вы называете это так: source_envfile .env

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

также может возникнуть проблема с cat | while read подход. Я бы рекомендовал использовать подход while read line; do . done .

основываясь на других ответах, вот способ экспортировать только подмножество строк в файл, включая значения с пробелами, такими как PREFIX_ONE=»a word» :

у меня есть проблемы с ранее предложенными решениями:

  • решение@anubhava делает написание файлов конфигурации bash friendly очень раздражающим очень быстро, а также — вы можете не всегда экспортировать свою конфигурацию.
  • @Silas Paul решение ломается, когда у вас есть переменные, которые имеют пробелы или другие символы, которые хорошо работают в кавычках значений, но $() делает беспорядок.

вот мое решение, которое все еще довольно ужасно IMO-и не решает проблему «экспорт только в один ребенок», рассмотренную Сайласом (хотя вы, вероятно, можете запустить ее в под-оболочке, чтобы ограничить область):

пробелы в значении

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

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

один на основе sed и @javier-buzzi ответ:

и один с прочитанной строкой в цикле на основе @john1024 ответ

ключ заключается в использовании declare -x и ввод строки в двойные кавычки. Я не знаю, почему, но когда вы переформатируете код цикла на несколько строк, он не будет работать — я не программист bash, я просто сожрал их, это все еще магия для меня:)

если вы получаете ошибку, потому что одна из ваших переменных содержит значение, содержащее пробелы, вы можете попытаться сбросить bash IFS (внутренний разделитель полей) в \n пусть Баш интерпретирует cat .env результат в виде списка параметров для env исполняемый файл.

Если вы хотите загрузить ваш .env-файл в запущенный процесс внутри кода Visual Studio можно добавить ссылку на свой .env файл в вашем launch.json С помощью envFile свойства:

я наткнулся на эту тему, когда пытался повторно использовать Docker —env-file s в оболочке. формат не совместим с bash, но это просто: name=value , не цитирую, нет замены. Они также игнорируют пустые строки и # комментарии.

Я не мог получить совместимость с posix, но вот тот, который должен работать в bash-подобных оболочках (протестирован в zsh на OSX 10.12.5 и bash на Ubuntu 14.04):

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

Источник

Оцените статью