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?


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

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).


1

Kerjakan saja:

while read LINE; do export "$LINE"; done < ./tmp.txt

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.