Mengganti hanya variabel tertentu dengan envsubst


54

Saya mencoba melakukan penggantian variabel lingkungan envsubst, tetapi saya hanya ingin mengganti variabel tertentu.

Dari dokumen saya harus bisa mengatakan envsubstuntuk hanya mengganti variabel-variabel tertentu tetapi saya gagal untuk dapat melakukan itu.

Misalnya, jika saya memiliki file yang berisi:

VAR_1=${VAR_1}
VAR_2=${VAR_2}

bagaimana saya harus mengeksekusi envsubstsehingga hanya menggantikan referensi ${VAR_1}?

Jawaban:



131

Per halaman manual:

envsubst [OPTION] [SHELL-FORMAT]

Jika SHELL-FORMAT diberikan, hanya variabel lingkungan yang dirujuk dalam SHELL-FORMAT yang diganti; jika tidak semua referensi variabel lingkungan yang terjadi dalam input standar diganti.

Di mana string SHELL-FORMAT adalah "string dengan referensi ke variabel shell dalam bentuk $variableatau ${variable}[...] Nama-nama variabel harus hanya terdiri dari karakter ASCII alfanumerik atau garis bawah, tidak dimulai dengan angka dan bukan kosong; jika tidak, referensi variabel tersebut adalah diabaikan. " .
Jadi, kita harus meneruskan nama variabel masing-masing ke envsubstdalam string format shell (jelas, mereka perlu melarikan diri / dikutip agar dapat diteruskan secara harfiah ke envsubst). Contoh:

masukan file misalnya infile:

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

dan beberapa nilai suka

export  VAR1="one" VAR2="two" VAR3="three"

lalu berlari

envsubst '${VAR1} ${VAR3}' <infile

atau

envsubst '${VAR1},${VAR3}' <infile

atau

envsubst '${VAR1}
${VAR3}' <infile

output

VAR1=one
VAR2=${VAR2}
VAR3=three

Atau, jika Anda lebih suka backslash:

envsubst \$VAR1,\$VAR2 <infile

menghasilkan

VAR1=one
VAR2=two
VAR3=${VAR3}

14
mengapa ini bukan jawaban yang diterima?
Qsiris

3
Ya ini jawaban yang benar!
Thomas Decaux

3
Jika Anda tahu awalan variabel yang digunakan untuk membatasi variabel yang dapat diganti:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott

Atau jika Anda memiliki daftar mereka di SUBST_VARSkemudian:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott
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.