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.


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


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.


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.

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

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.