12

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

14

TL;DR: Как экспортировать набор пар "ключ/значение" из текстового файла в окружение оболочки?


Я пишу скрипт на bash, который парсит файлы с тремя переменными в определенной папке. Один из таких файлов выглядит следующим образом:

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt программа.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

Этот файл находится по пути ./conf/prac1.

Мой скрипт minientrega.sh парсит файл следующим образом:

cat ./conf/$1 | while read line; do
    export $line
done

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

Я также пробовал использовать source ./conf/$1, но проблема остается той же.

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

5 ответ(ов)

10

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

Пример использования:

set -o allexport  # Включает автоматический экспорт переменных
source conf-file  # Загружает переменные из конфигурационного файла
set +o allexport  # Отключает автоматический экспорт переменных

Так, при использовании set -o allexport все переменные, определенные в загружаемом конфигурационном файле, будут автоматически экспортированы в окружение.

3

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

Добавьте команду export непосредственно в файл:

export MINIENTREGA_FECHALIMITE="2011-03-31"
export MINIENTREGA_FICHEROS="informe.txt программа.c"
export MINIENTREGA_DESTINO="./destino/entrega-prac1"

После этого вам нужно загрузить файл в текущий shell, используя:

. ./conf/prac1

ИЛИ

source ./conf/prac1
1

Наиболее эффективный способ, который я нашел:

export $(xargs < .env)

Объяснение

Когда у нас есть файл .env, который выглядит следующим образом:

key=val
foo=bar

Команда xargs < .env преобразует его в строку key=val foo=bar.

Таким образом, в итоге мы получаем команду export key=val foo=bar, и именно это нам нужно!

Ограничения

  1. Этот метод не обрабатывает случаи, когда значения содержат пробелы. Команды, такие как env, выводят данные в подобном формате. – @Shardj
0

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

# Загрузка .env в оболочке
dotenv () {
  set -a
  [ -f .env ] && . .env
  set +a
}

# Выполнение dotenv при входе в систему
dotenv

# Выполнение dotenv в каждой новой директории
cd () {
  builtin cd $@
  dotenv
}

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

0

Команда eval $(cat .env | sed 's/^/export /') используется для загрузки переменных окружения из файла .env. Вот как это работает:

  1. cat .env — эта команда считывает содержимое файла .env.
  2. sed 's/^/export /' — утилита sed добавляет слово export перед каждой строкой файла. Это преобразует каждую строку, содержащую переменную окружения, в формат, подходящий для экспортирования.
  3. eval $(...) — команда eval выполняет результат подкоманды. Таким образом, все строки, которые представляют переменные окружения из файла, будут выполнены и установлены в текущую сессию терминала.

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь