Apakah ada cara mudah untuk mengganti / mengevaluasi variabel lingkungan dalam file? Seperti katakanlah saya memiliki file config.xml
yang berisi:
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
<property>
<name>rootPath</name>
<value>/services/$SERVICE_NAME</value>
</property>
... dll. Saya ingin mengganti $INSTANCE_ID
dalam file dengan nilai INSTANCE_ID
variabel lingkungan, $SERVICE_NAME
dengan nilai SERVICE_NAME
env var. Saya tidak akan tahu apriori mana vars lingkungan diperlukan (atau lebih tepatnya, saya tidak ingin harus memperbarui skrip jika seseorang menambahkan variabel lingkungan baru ke file konfigurasi). Terima kasih!
shell-script
text-processing
scripting
environment-variables
Robert Fraser
sumber
sumber
Jawaban:
Anda dapat menggunakan
envsubst
(bagian darignu gettext
):akan mengganti variabel lingkungan di file Anda dengan nilainya yang sesuai. Nama-nama variabel harus hanya terdiri dari karakter alfanumerik atau garis bawah ASCII, tidak dimulai dengan angka dan tidak kosong; jika tidak, referensi variabel tersebut diabaikan.
Untuk mengganti hanya variabel lingkungan tertentu, lihat pertanyaan ini.
sumber
^[[:alpha:]_][[:alnum:]_]*$
dengan lokal POSIX.Ini tidak terlalu bagus tetapi berfungsi
Jika itu ada dalam skrip shell, akan terlihat seperti:
Edit, proposal kedua:
Edit, tidak terkait langsung dengan pertanyaan, tetapi jika variabel dibaca dari file:
sumber
EOF
, baris yang tersisa akan dieksekusi sebagai perintah oleh shell. Kita dapat mengubah pemisah menjadi sesuatu yang lebih panjang atau lebih rumit, tetapi masih ada kemungkinan teoritis untuk bertabrakan. Dan seseorang dapat dengan sengaja membuat file dengan pemisah untuk menjalankan perintah."; ls ;"
di dalam file dan lakukaneval
perintah itu lagi :) Ini masalah yang hampir sama dengan serangan injeksi SQL. Anda harus benar-benar berhati-hati ketika mencampur data dengan kode (dan itulah perintah shell), kecuali Anda benar - benar yakin tidak ada yang mencoba melakukan apa pun untuk mengacaukan hari Anda.`"; ls ;"`
- format komentar memakan backticks. Tapi sebenarnya dia harus ada di`ls`
sini. Intinya adalah bahwa isi file mengarah ke eksekusi kode arbitrer dan tidak ada yang dapat Anda lakukan.Jika Anda memiliki Perl (tetapi tidak mendapatkan teks dan
envsubst
), Anda dapat melakukan penggantian sederhana dengan skrip pendek:Saya berasumsi nama variabel hanya akan memiliki huruf besar dan garis bawah, tetapi pola pertama harus mudah diubah sesuai kebutuhan.
$ENV{...}
referensi lingkungan yang dilihat Perl.Jika Anda ingin mendukung
${...}
sintaks atau melempar kesalahan pada variabel yang tidak disetel, Anda perlu beberapa pekerjaan lagi. Setaragettext
denganenvsubst
itu adalah:Meskipun saya merasa bahwa memberi makan variabel seperti itu melalui lingkungan proses tampaknya agak rapuh secara umum: Anda tidak dapat menggunakan variabel sewenang-wenang dalam file (karena mereka mungkin memiliki makna khusus), dan beberapa nilai mungkin bisa memiliki setidaknya setengah data sensitif di dalamnya.
sumber
perl -pe 's{\$(\{)?(\w+)(?(1)\})}{$ENV{$2} // $&}ge'
untuk hanya mengganti variabel yang didefinisikan.Bolehkah saya menyarankan skrip saya sendiri untuk ini?
https://github.com/rydnr/set-square/blob/master/.templates/common-files/process-file.sh
sumber
Demikian pula dengan jawaban Perl, substitusi variabel lingkungan dapat didelegasikan ke PHP CLI. Ketergantungan pada PHP mungkin atau mungkin tidak dapat diterima tergantung pada tumpukan teknologi yang digunakan.
Anda dapat melangkah lebih jauh dan memasukkannya ke dalam skrip yang dapat digunakan kembali, misalnya
envsubst
:Penggunaannya akan:
sumber