Як експортувати змінні з файлу?


78

У мене є tmp.txtфайл, що містить змінні, які потрібно експортувати, наприклад:

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

Як я можу експортувати всі ці змінні за допомогою exportкоманди, щоб згодом їх використовувати дочірні процеси?


1
bash --init-файл somefile.blah -c "команда"
Ділліан Мерфі

Так є корисна відповідь про те, як автоматично джерело .envфайлів, коли ви cdпотрапляєте в каталог.
Дан Даскалеску

@Neerav Будь ласка, прийміть іншу відповідь. Це набагато краще рішення.
coderDude

Відповіді:


64
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
Це не спрацює, якщо, наприклад, файл середовища містить коментарі. (наприклад, файли, які можна повторно використати у середовищі Systemd's EnvironmentFile)
Chris Lamb

3
@ChrisLamb ви можете використовувати grepдля пропуску коментарів:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee

181
set -a
. ./tmp.txt
set +a

set -aвикликає автоматичне експортування змінних¹, визначених відтепер. Він доступний у будь-якій оболонці Борна. .- це стандартне і назва 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

@RalfFriedl це повинно працювати, чому б ні? Це не дуже елегантно, а джерело з цим set -aбуло б набагато простіше, але це насправді працює.
тердон

Це крихке. Він не дозволяє коментувати у вхідному файлі, не обробляє належним чином цитовані значення змінних та не працює на багаторядкових змінних. Звичайно, у мене не багато багаторядкових змінних, але я регулярно користуюся коментарями і часто потрібно використовувати лапки для змінних значень.
Луї

Це працювало для мене.
mchawre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.