Установить переменные окружения из файла с парами ключ/значение
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 ответ(ов)
-o allexport
позволяет экспортировать все последующие определения переменных. В то время как +o allexport
отключает эту функцию.
Пример использования:
set -o allexport # Включает автоматический экспорт переменных
source conf-file # Загружает переменные из конфигурационного файла
set +o allexport # Отключает автоматический экспорт переменных
Так, при использовании set -o allexport
все переменные, определенные в загружаемом конфигурационном файле, будут автоматически экспортированы в окружение.
Проблема с вашим подходом заключается в том, что 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
Наиболее эффективный способ, который я нашел:
export $(xargs < .env)
Объяснение
Когда у нас есть файл .env
, который выглядит следующим образом:
key=val
foo=bar
Команда xargs < .env
преобразует его в строку key=val foo=bar
.
Таким образом, в итоге мы получаем команду export key=val foo=bar
, и именно это нам нужно!
Ограничения
- Этот метод не обрабатывает случаи, когда значения содержат пробелы. Команды, такие как
env
, выводят данные в подобном формате. – @Shardj
allexport
действительно упоминается в нескольких других ответах на этом форуме, и для него есть сокращение set -a
. Загрузка переменных окружения из файла .env действительно лучше, чем перебор строк с их экспортом, так как это позволяет использовать комментарии, пустые строки и даже переменные окружения, генерируемые командами. В моем файле .bashrc есть следующий код:
# Загрузка .env в оболочке
dotenv () {
set -a
[ -f .env ] && . .env
set +a
}
# Выполнение dotenv при входе в систему
dotenv
# Выполнение dotenv в каждой новой директории
cd () {
builtin cd $@
dotenv
}
Этот код автоматически загружает переменные окружения при входе в систему и при смене директории, что делает ваше окружение более гибким и удобным.
Команда eval $(cat .env | sed 's/^/export /')
используется для загрузки переменных окружения из файла .env
. Вот как это работает:
cat .env
— эта команда считывает содержимое файла.env
.sed 's/^/export /'
— утилитаsed
добавляет словоexport
перед каждой строкой файла. Это преобразует каждую строку, содержащую переменную окружения, в формат, подходящий для экспортирования.eval $(...)
— командаeval
выполняет результат подкоманды. Таким образом, все строки, которые представляют переменные окружения из файла, будут выполнены и установлены в текущую сессию терминала.
Итого, с помощью этой команды вы загружаете все переменные окружения из .env файла в ваш текущий сеанс shell. Важно быть осторожным с этой командой, так как она выполнит все строки из файла. Убедитесь, что файл не содержит потенциально вредных команд.
Как проверить, установленна ли переменная в Bash
Извлечение имени файла и расширения в Bash
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash