envsubst:Mac OS X 10.8でコマンドが見つかりません


92

envsubstコマンドを含むスクリプトを実行しようとすると、このエラーが発生します。オンラインで見ると、これは標準のbashコマンドのようですので、それを機能させるために何をインストールすればよいかわかりません。


2
envsubstgettextパッケージに含まれています。自分でコンパイルできます。stackoverflow.com/questions/14940383/…を
ymonad '13年

それを回答として追加して、受け入れられるようにしたいですか?
Andrew

回答として投稿しました。
ymonad 2014年

回答:


130

編集:@cobberboyの回答はより正確です。彼に賛成票を投じます。

brew install gettext
brew link --force gettext 

以下は私の古い答えです:

envsubstgettextパッケージに含まれています。

したがって、次のような標準のビルドツールを使用して、あなた自身でそれをコンパイルするmakeか、使用してhomebrew

ただし、gettextMacOS にインストールする場合はほとんど問題がないようです。詳細については、次のURLを参照してください:MacOS Xにgettextをインストールする方法


8
一方でenvsubstのgettextの一部である(自作によってインストールされる)、それはデフォルトでリンクされていません。これは、gettextが樽のみの式であるためです。自作で樽をリンクするように指示することもできますが、これには意図しない副作用が生じる可能性があります。煩わしさが少ないアプローチはalias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'.profile(または同等のもの)に追加してエイリアスを設定することです。もちろん、別のバージョンのgettextがインストールされている場合もあります。あなたはそれを実行することでそれについて学ぶことができますbrew info gettext
trkoch 2015年

1
@trkochあなたはおそらく/usr/local/opt/gettext/bin/envsubstアップグレードを存続させるエイリアスを作成したいでしょう
クリストフ・ヘスラー

1
これは承認された回答ですが、@ cobberboyの回答までスクロールしてください。リンクを強制する必要があることもよくあるためです。
Big Money

なぜ私は突然より多くの賛成票を得ているのだろうと思いました。@ymonadの寛大さをありがとう
cobberboy 2018

1
/usr/local/Cellar/gettext/0.19.8.1をリンクしています... 194個のシンボリックリンクが作成されています... wtf 194個のシンボリックリンクですか?
Alexander Mills

233
brew install gettext
brew link --force gettext 

これにより、OS Xでenvsubstが有効になり、強制的に適切にリンクされます。自作がインストールされている必要があります。


1
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... wtf 194シンボリックリンク?
Alexander Mills

@AlexanderMillsええgettext、地獄がたくさんあります。envsubstインストールするだけではやり過ぎのようですが、これが最も早くて簡単な方法です。
cobberboy

彼らは単にフォルダーをシンボリックリンクするのではなく、すべてのファイルをシンボリックリンクしているようです
Alexander Mills

17

潜在的な混乱を解消するには:

  • envsubstある外部の実行、したがってバッシュの一部ではないが。外部実行可能ファイルは、プラットフォーム依存であり、どちらが使用可能であるか、それらの特定の動作とそれらがサポートする特定のオプションの両方についてです(ただし、POSIX仕様に基づいた共通のサブセットがあることを願います)
  • 直接に組み込まれているコマンドがbash呼ばれている組み込みコマンドを、そして唯一の彼らが上に存在することが頼ることができるすべてのプラットフォーム

特定のコマンドが組み込みであるかどうかテストするには、

type <cmdName>

目の前のケースでtype envsubst-bash: type: envsubst: not found、macOS 10.13 で実行するとが返され、そこから推測できます。

  • envsubst 組み込みではありません
  • envsubstシステムに$PATH存在しない(したがって、システムに存在しない可能性が高い)

(対照的に、Ubuntu 12.04システムなどで同じonコマンドを実行するとが返さenvsubst is hashed (/usr/bin/envsubst)れ、ユーティリティが存在し、どこにあるかがわかります。)


通常の警告が適用さenvsubstれますがeval、の間に合わせの代替手段はを使用evalすることです。コンテンツを制御または信頼する文字列でのみ使用してください。

展開されsample.txtていない変数参照を含むテキストを含むファイルを想定します。例えば:

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

同等のもの:

envsubst < sample.txt

です:

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

ただし、決定的な違いがあります。

  • envsubst環境変数参照のみを展開します
  • 一方、シェル変数参照eval拡張さます - 組み込みコマンド置換も同様です。これは、セキュリティ上の懸念を利用するものです。eval

eval echoはソースを信頼しているのでそれが同じでenvsubst < .env.exampleはないというアイデアが好きです。同じではありませんeval echo < .env.example
iRaS

1

私は今、envsubstを必要とするbashスクリプトでこれを使用しています。

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コマンドとして使うことができます-もちろんそれは完全な機能や何か他のものではありません:

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

これはすべての
sudo

すでに述べたように、これは完全な機能ではない回避策です。"$ lineを追加してみることもできますが、まだ試していません
iRaS

0

homebrewとgettextをインストールしたくない場合は、1行のperl実行可能ファイルで実行できます。

#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.