Bagaimana cara mengekspor variabel dari file?

80

Saya memiliki tmp.txtfile yang berisi variabel yang akan diekspor, misalnya:

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

Bagaimana saya bisa mengekspor semua variabel ini menggunakan exportperintah, sehingga nanti bisa digunakan oleh proses anak?

Neerav
sumber
1
bash --init-file somefile.blah -c "command"
Dillian Murphey
SO memiliki jawaban yang bermanfaat tentang cara mencari .envfile secara otomatis saat Anda cdmasuk ke direktori.
Dan Dascalescu
@Neerav Silakan terima jawaban lain. Itu solusi yang jauh lebih baik.
coderDude

Jawaban:

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

Menilai dengan pertanyaan Anda yang lain, Anda tidak ingin meng-hardcode nama variabel:

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

menguji:

$ 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
glenn jackman
sumber
2
Ini tidak akan berfungsi jika file lingkungan berisi komentar, misalnya. (mis. file yang dapat digunakan kembali oleh EnvironmentFile systemd)
Chris Lamb
3
@ ChrisLamb dapat Anda gunakan grepuntuk melewati komentar:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee
182
set -a
. ./tmp.txt
set +a

set -amenyebabkan variabel¹ yang didefinisikan mulai sekarang akan diekspor secara otomatis. Ini tersedia di shell seperti Bourne. .adalah nama standar dan Bourne untuk sourceperintah jadi saya lebih suka untuk portabilitas ( sourceberasal dari cshdan sekarang tersedia di sebagian besar shell mirip Bourne modern termasuk bash(kadang-kadang dengan perilaku yang sedikit berbeda)).

Dalam shell POSIX, Anda juga dapat menggunakan set -o allexportcara alternatif yang lebih deskriptif untuk menuliskannya ( set +o allexportuntuk tidak disetel).


¹ Dalam bash, berhati-hatilah bahwa itu juga menyebabkan semua fungsi yang dideklarasikan ketika allexportsedang diekspor ke lingkungan (sebagai BASH_FUNC_myfunction%%variabel lingkungan yang kemudian diimpor oleh semua bashshell dijalankan di lingkungan itu, bahkan ketika berjalan sebagai sh).

Stéphane Chazelas
sumber
1

Kerjakan saja:

while read LINE; do export "$LINE"; done < ./tmp.txt
benjamin berhault
sumber
Apakah Anda memeriksa apakah itu berhasil?
RalfFriedl
@RalfFriedl ini seharusnya berhasil, mengapa tidak? Ini tidak terlalu elegan dan sumber dengan set -aakan jauh lebih sederhana, tetapi ini benar-benar berhasil.
terdon
Ini rapuh. Itu tidak memungkinkan komentar dalam file input, tidak menangani nilai variabel yang dikutip dengan benar, dan gagal pada variabel multi-line. Memang saya tidak memiliki banyak variabel multi-line, tetapi saya memang menggunakan komentar secara teratur dan sering perlu menggunakan tanda kutip untuk nilai variabel.
Louis
Itu berhasil untuk saya.
mchawre