envsubst: perintah tidak ditemukan di Mac OS X 10.8

92

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.

Andrew
sumber
2
envsubstsudah termasuk dalam gettextpaket. Anda dapat mengkompilasi sendiri. lihat stackoverflow.com/questions/14940383/…
ymonad
Ingin menambahkan itu sebagai jawaban agar saya bisa menerimanya?
Andrew
Saya mempostingnya sebagai jawaban.
ymonad

Jawaban:

131

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

ymonad
sumber
8
Meskipun 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.
Trkoch
2
@trkoch Anda mungkin ingin alias /usr/local/opt/gettext/bin/envsubstyang bertahan peningkatan
Christoph Hösler
1
Meskipun ini adalah jawaban yang diterima, silakan gulir ke bawah ke jawaban @ cobberboy, karena mungkin juga Anda perlu memaksa tautan tersebut.
Uang Besar
Saya bertanya-tanya mengapa saya tiba-tiba mendapatkan lebih banyak suara positif. Terima kasih atas kemurahan hati Anda @ymonad
cobberboy
1
Menghubungkan /usr/local/Cellar/gettext/0.19.8.1 ... 194 symlink dibuat ... wtf 194 symlinks?
Alexander Mills
235
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.

cobberboy
sumber
1
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 symlink?
Alexander Mills
@Alexanderills ya gettextmencakup banyak hal; sepertinya berlebihan hanya untuk envsubstmenginstal tetapi ini adalah cara tercepat dan termudah.
cobberboy
Sepertinya mereka menghubungkan setiap file dan bukan hanya menghubungkan sebuah folder
Alexander Mills
17

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)
  • Perintah langsung dibangun ke 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 builtin
  • envsubsttidak 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 lingkungan
  • sedangkan evalakan memperluas referensi variabel shell juga - serta substitusi perintah yang disematkan , yang memanfaatkan evalmasalah keamanan.
mklement0
sumber
Saya suka ide eval echokarena saya mempercayai sumbernya tetapi tidak sama .. envsubst < .env.exampletidak bisa hanyaeval echo < .env.example
iRaS
1

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
iRaS
sumber
Ini tampaknya menghapus semua spasi kosong di depan dan di belakang
sudo
seperti yang dikatakan ini adalah solusi yang tidak memiliki fitur lengkap. Anda dapat mencoba menambahkan "sekitar $ baris tetapi saya belum mencobanya
iRaS
1

Jika 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;
cyberz
sumber