Как экспортировать переменные из файла?

80

У меня есть tmp.txtфайл, содержащий переменные для экспорта, например:

a=123
b="hello world"
c="one more variable"

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

Neerav
источник
1
bash --init-file somefile.blah -c "команда"
Диллиан Мерфи,
У SO есть полезный ответ о том, как автоматически получать .envфайлы при входе cdв каталог.
Дан Даскалеску
@Neerav Пожалуйста, примите другой ответ. Это гораздо лучшее решение.
CoderDude

Ответы:

65
source tmp.txt
export a b c
./child ...

Судя по вашему другому вопросу, вы не хотите жестко кодировать имена переменных:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

Проверь это:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable
Гленн Джекман
источник
2
Это не будет работать, например, если файл среды содержит комментарии. (например, файлы, которые могут быть повторно использованы systemfile для systemd)
Крис Лэмб
3
@ChrisLamb вы можете использовать, grepчтобы пропустить комментарии:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee
182
set -a
. ./tmp.txt
set +a

set -aзаставляет переменные¹, определенные отныне, автоматически экспортироваться. Он доступен в любой оболочке, похожей на Bourne. .это стандарт и название Bourne для sourceкоманды, поэтому я предпочитаю его для переносимости ( sourceпроисходит от cshи теперь доступен в большинстве современных Bourne-подобных оболочек, включая, bashхотя (иногда с немного другим поведением)).

В оболочках POSIX вы также можете использовать set -o allexportв качестве более наглядного альтернативного способа его записи ( set +o allexportдля сброса).


¹ bashИмейте в виду, что это также приводит к тому, что все функции, объявленные в то время allexportкак включено, экспортируются в среду (как BASH_FUNC_myfunction%%переменные среды, которые затем импортируются всеми bashоболочками, запущенными в этой среде, даже если они запускаются как sh).

Стефан Шазелас
источник
1

Просто сделать:

while read LINE; do export "$LINE"; done < ./tmp.txt
Бенджамин Берхо
источник
Вы проверили, работает ли это?
Ральф Фридл
@RalfFriedl это должно работать, почему бы и нет? Это не очень элегантно, и поиск источников set -aбудет намного проще, но это действительно работает.
Тердон
Это хрупко Он не допускает комментарии во входном файле, не обрабатывает значения переменных в кавычках должным образом и завершается ошибкой многострочных переменных. Конечно, у меня не так много многострочных переменных, но я регулярно использую комментарии, и мне часто приходится использовать кавычки для значений переменных.
Луи
Это сработало для меня.
Мчавр