Ketika saya mencoba menjalankan skrip yang berisi perintah envsubst, saya mendapatkan kesalahan ini. Mencari online, ini tampaknya menjadi perintah bash standar, jadi saya tidak yakin apa yang harus diinstal agar dapat berfungsi.
92
envsubst
sudah termasuk dalamgettext
paket. Anda dapat mengkompilasi sendiri. lihat stackoverflow.com/questions/14940383/…Jawaban:
Edit: Jawaban @cobberboy lebih benar. upvote dia.
Berikut adalah jawaban lama saya:
envsubst
sudah termasuk dalamgettext
paket.Oleh karena itu, Anda dapat mengompilasinya sendiri, menggunakan alat build standar seperti
make
atau menggunakanhomebrew
.Namun, tampaknya ada sedikit masalah saat menginstal
gettext
di MacOS. Lihat url berikut untuk detailnya: Cara menginstal gettext di MacOS Xsumber
envsubst
merupakan bagian dari gettext (seperti yang diinstal oleh homebrew), ini tidak ditautkan secara default. Saya berharap ini karena gettext adalah formula khusus tong. Anda bisa memberi tahu homebrew untuk menghubungkan tong, tetapi ini mungkin memiliki efek samping yang tidak diinginkan. Pendekatan yang tidak terlalu mengganggu adalah menyiapkan alias dengan menambahkanalias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
ke.profile
(atau yang setara). Tentu saja, Anda mungkin menginstal versi gettext lain. Anda dapat mempelajarinya dengan berlaribrew info gettext
./usr/local/opt/gettext/bin/envsubst
yang bertahan peningkatanIni akan mengaktifkan envsubst di OS X, dan memaksanya untuk menautkan dengan benar. Ini membutuhkan homebrew untuk diinstal.
sumber
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... wtf 194 symlink?gettext
mencakup banyak hal; sepertinya berlebihan hanya untukenvsubst
menginstal tetapi ini adalah cara tercepat dan termudah.Untuk menjernihkan potensi kebingungan:
envsubst
merupakan eksekusi eksternal dan karenanya bukan bagian dari Bash ; executable eksternal bergantung pada platform , baik dalam hal mana yang tersedia serta perilaku spesifiknya dan opsi spesifik yang mereka dukung (meskipun, mudah-mudahan, ada subset umum berdasarkan spesifikasi POSIX)bash
disebut builtin , dan hanya mereka dapat diandalkan untuk hadir pada semua platform .Untuk menguji apakah perintah yang diberikan adalah bawaan , gunakan
type <cmdName>
Dalam kasus yang dihadapi, menjalankan
type envsubst
macOS 10.13 akan kembali-bash: type: envsubst: not found
, dari mana Anda dapat menyimpulkan:envsubst
BUKAN builtinenvsubst
tidak ada di sistem Anda$PATH
(dan kemungkinan besar tidak ada di sistem Anda)(Sebaliknya, menjalankan perintah yang sama pada, misalnya, kembali sistem Ubuntu 12.04
envsubst is hashed (/usr/bin/envsubst)
, yang memberi tahu Anda bahwa utilitas ada dan di mana lokasinya.)Alternatif sementara untuk
envsubst
adalah menggunakaneval
, meskipun peringatan biasa berlaku: gunakaneval
hanya pada string yang kontennya Anda kontrol atau percayai:Asumsikan
sample.txt
file berisi teks dengan referensi variabel yang tidak diperluas; misalnya:cat > sample.txt <<'EOF' Honey, I'm $USER and I'm $HOME. EOF
Setara dengan:
adalah:
eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""
Ada perbedaan penting , namun:
envsubst
hanya memperluas referensi variabel lingkunganeval
akan memperluas referensi variabel shell juga - serta substitusi perintah yang disematkan , yang memanfaatkaneval
masalah keamanan.sumber
eval echo
karena saya mempercayai sumbernya tetapi tidak sama ..envsubst < .env.example
tidak bisa hanyaeval echo < .env.example
Saya menggunakan ini sekarang di skrip bash saya yang membutuhkan envsubst:
if ! which envsubst > /dev/null 2>&1; then envsubst() { while read line; do line=$( echo $line | sed 's/"/\\"/g' ) eval echo $line done } fi
Anda dapat menggunakannya sebagai perintah envsubst - tentu saja ini bukan fitur lengkap atau yang lainnya:
envsubst <<<'Honey, I am $HOME.' envsubst < input > output 2> corrupt
sumber
"
sekitar $ baris tetapi saya belum mencobanyaJika Anda tidak ingin repot menginstal homebrew dan gettext, satu baris perl yang dapat dieksekusi akan melakukan:
#!/usr/bin/perl -p $_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
sumber