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:
envsubstsudah termasuk dalam gettextpaket.
Oleh karena itu, Anda dapat mengompilasinya sendiri, menggunakan alat build standar seperti makeatau menggunakan homebrew.
Namun, tampaknya ada sedikit masalah saat menginstal gettextdi MacOS. Lihat url berikut untuk detailnya: Cara menginstal gettext di MacOS X
envsubstmerupakan 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/envsubstyang 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?
gettextmencakup banyak hal; sepertinya berlebihan hanya untuk envsubstmenginstal tetapi ini adalah cara tercepat dan termudah.
Untuk menjernihkan potensi kebingungan:
envsubstmerupakan 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)bashdisebut 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 envsubstmacOS 10.13 akan kembali -bash: type: envsubst: not found, dari mana Anda dapat menyimpulkan:
envsubst BUKAN builtinenvsubsttidak 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 envsubstadalah menggunakan eval, meskipun peringatan biasa berlaku: gunakan evalhanya pada string yang kontennya Anda kontrol atau percayai:
Asumsikan sample.txtfile 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:
envsubsthanya memperluas referensi variabel lingkunganevalakan memperluas referensi variabel shell juga - serta substitusi perintah yang disematkan , yang memanfaatkan evalmasalah keamanan.eval echokarena saya mempercayai sumbernya tetapi tidak sama .. envsubst < .env.exampletidak 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
envsubstsudah termasuk dalamgettextpaket. Anda dapat mengkompilasi sendiri. lihat stackoverflow.com/questions/14940383/…