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.
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.
Jawaban:
Edit: Jawaban @cobberboy lebih benar. upvote dia.
brew install gettext
brew link --force gettext
Berikut adalah jawaban lama saya:
envsubst
sudah termasuk dalam gettext
paket.
Oleh karena itu, Anda dapat mengompilasinya sendiri, menggunakan alat build standar seperti make
atau menggunakan homebrew
.
Namun, tampaknya ada sedikit masalah saat menginstal gettext
di MacOS. Lihat url berikut untuk detailnya: Cara menginstal gettext di MacOS X
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 menambahkan alias 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 berlari brew info gettext
.
/usr/local/opt/gettext/bin/envsubst
yang bertahan peningkatan
brew install gettext
brew link --force gettext
Ini akan mengaktifkan envsubst di OS X, dan memaksanya untuk menautkan dengan benar. Ini membutuhkan homebrew untuk diinstal.
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... wtf 194 symlink?
gettext
mencakup banyak hal; sepertinya berlebihan hanya untuk envsubst
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 menggunakan eval
, meskipun peringatan biasa berlaku: gunakan eval
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:
envsubst < sample.txt
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 memanfaatkan eval
masalah keamanan.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
"
sekitar $ baris tetapi saya belum mencobanya
envsubst
sudah termasuk dalamgettext
paket. Anda dapat mengkompilasi sendiri. lihat stackoverflow.com/questions/14940383/…