envsubst: komut Mac OS X 10.8'de bulunamadı


92

Envsubst komutunu içeren bir betik çalıştırmayı denediğimde bu hatayı alıyorum. Çevrimiçi baktığımda, bu standart bir bash komutu gibi görünüyor, bu yüzden çalışmasını sağlamak için ne kurmam gerektiğinden emin değilim.


2
envsubstgettextpakete dahildir . kendi başınıza derleyebilirsiniz. bkz stackoverflow.com/questions/14940383/...
ymonad

Kabul edebilmek için bunu bir cevap olarak eklemek ister misiniz?
Andrew

Cevap olarak gönderdim.
ymonad

Yanıtlar:


131

Düzenleme: @cobberboy'un cevabı daha doğrudur. ona olumlu oy verin.

brew install gettext
brew link --force gettext 

Eski cevabım şu:

envsubstgettextpakete dahildir .

Bu nedenle, gibi standart yapı araçlarını makekullanarak veya kullanarak kendi başınıza derleyebilirsiniz homebrew.

Ancak, gettextMacOS'a yüklerken küçük bir sorunu var gibi görünüyor . Ayrıntılar için aşağıdaki url'ye bakın: MacOS X'te gettext nasıl kurulur


8
Gettext'in envsubstbir parçası iken (homebrew tarafından kurulduğu gibi), varsayılan olarak bağlantılı değildir. Bunun, gettext'in yalnızca fıçı içeren bir formül olması nedeniyle olmasını bekliyorum. Homebrew'e fıçıyı bağlamasını söyleyebilirsin, ama bunun istenmeyen yan etkileri olabilir. Daha az müdahaleci bir yaklaşım, alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'size .profile(veya eşdeğerine) ekleyerek bir takma ad ayarlamaktır . Elbette, başka bir gettext sürümüne sahip olabilirsiniz. Koşarak öğrenebilirsiniz brew info gettext.
trkoch

2
@trkoch Muhtemelen /usr/local/opt/gettext/bin/envsubstyükseltmelerden sonra kalan bir takma ad kullanmak istiyorsunuz
Christoph Hösler

1
Kabul edilen cevap bu olsa da, lütfen @ cobberboy'un cevabına gidin, çünkü muhtemelen bağlantıyı zorlamanız gereken yaygın bir sorundur.
Big Money

Neden aniden daha fazla oy aldığımı merak ettim. Cömertliğiniz için teşekkürler @ymonad
cobberboy

1
Bağlanıyor /usr/local/Cellar/gettext/0.19.8.1 ... 194 sembolik bağ oluşturuldu ... wtf 194 sembolik bağ?
Alexander Mills

235
brew install gettext
brew link --force gettext 

Bu, OS X'de envsubst'u etkinleştirecek ve onu düzgün bir şekilde bağlanmaya zorlayacaktır. Homebrew'in kurulmasını gerektirir.


1
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194 sembolik bağlantı?
Alexander Mills

@AlexanderMills evet gettext, pek çok şey içeriyor; sadece envsubstyüklenmek için aşırı gibi görünüyor ama en hızlı ve en basit yol bu.
cobberboy

onlar her dosyayı sembolik bağlantılarını yerine sadece bir klasör sembolik bağlantılarını konum gibi görünüyor
Alexander Mills

17

Olası kafa karışıklığını gidermek için:

  • envsubstBir olan dış yürütülebilir ve bu nedenle Bash parçası olmayan ; harici çalıştırılabilir dosyalar platforma bağlıdır , hem hangilerinin mevcut olduğu hem de özel davranışları ve destekledikleri özel seçenekler açısından (umarız, POSIX özelliklerine dayalı ortak bir alt küme vardır)
  • Doğrudan yerleşik komutlar bashdenir yerleşiklerini ve sadece onlar üzerinde mevcut olması güvenilemez bütün platformlarda .

To testi, belirli bir komut bir yerleşik olup olmadığını , kullanım

type <cmdName>

Eldeki durumda, type envsubstmacOS 10.13 üzerinde çalışmak -bash: type: envsubst: not foundşu sonuca varabileceğiniz geri döner :

  • envsubst yerleşik DEĞİLDİR
  • envsubstsisteminizde değil $PATH(ve bu nedenle muhtemelen sisteminizde mevcut değil)

(Bunun tersine, aynı komut üzerinde çalıştırma, örneğin, bir Ubuntu 12.04 sistemi geri döner envsubst is hashed (/usr/bin/envsubst), bu size yardımcı programın mevcut olduğunu ve nerede bulunduğunu söyler.)


Bunun geçici bir alternatifi envsubstkullanmaktır eval, ancak her zamanki uyarı geçerlidir: evalyalnızca içeriğini kontrol ettiğiniz veya güvendiğiniz dizelerde kullanın :

sample.txtGenişletilmemiş değişken referanslara sahip metin içeren bir dosya varsayın ; Örneğin:

cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF

Eşdeğeri:

envsubst < sample.txt

dır-dir:

eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""

Bununla birlikte , çok önemli bir fark var :

  • envsubstyalnızca ortam değişkeni referanslarını genişletir
  • buna karşılık eval kabuk değişken referanslarını da genişletir - ayrıca bir güvenlik endişesinden yararlanan gömülü komut ikamelerini de genişletir .eval

eval echoKaynağa güvendiğim için fikrini seviyorum ama bu aynı envsubst < .env.exampledeğil .. sadece olamazeval echo < .env.example
iRaS

1

Bunu şimdi envsubst gerektiren bash betiğimde kullanıyorum:

if ! which envsubst > /dev/null 2>&1; then
    envsubst() {
        while read line; do
            line=$( echo $line | sed 's/"/\\"/g' )
            eval echo $line
        done
    }
fi

envsubst komutu olarak kullanabilirsiniz - elbette tam özellikli veya başka bir şey değil:

envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt

Bu, tüm öndeki ve sondaki boşlukları
sudo

dediği gibi bu, özelliği tamamlanmamış bir geçici çözümdür. "$ line civarında eklemeyi deneyebilirsiniz, ancak bunu henüz denemedim
iRaS

1

Homebrew ve gettext'i kurmakla uğraşmak istemiyorsanız, tek satırlık bir perl çalıştırılabilir dosyası şunları yapacaktır:

#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.