envsubstコマンドを含むスクリプトを実行しようとすると、このエラーが発生します。オンラインで見ると、これは標準のbashコマンドのようですので、それを機能させるために何をインストールすればよいかわかりません。
envsubstコマンドを含むスクリプトを実行しようとすると、このエラーが発生します。オンラインで見ると、これは標準のbashコマンドのようですので、それを機能させるために何をインストールすればよいかわかりません。
回答:
編集:@cobberboyの回答はより正確です。彼に賛成票を投じます。
brew install gettext
brew link --force gettext
以下は私の古い答えです:
envsubst
gettext
パッケージに含まれています。
したがって、次のような標準のビルドツールを使用して、あなた自身でそれをコンパイルするmake
か、使用してhomebrew
。
ただし、gettext
MacOS にインストールする場合はほとんど問題がないようです。詳細については、次のURLを参照してください:MacOS Xにgettextをインストールする方法
envsubst
のgettextの一部である(自作によってインストールされる)、それはデフォルトでリンクされていません。これは、gettextが樽のみの式であるためです。自作で樽をリンクするように指示することもできますが、これには意図しない副作用が生じる可能性があります。煩わしさが少ないアプローチはalias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
、.profile
(または同等のもの)に追加してエイリアスを設定することです。もちろん、別のバージョンのgettextがインストールされている場合もあります。あなたはそれを実行することでそれについて学ぶことができますbrew info gettext
。
/usr/local/opt/gettext/bin/envsubst
アップグレードを存続させるエイリアスを作成したいでしょう
brew install gettext
brew link --force gettext
これにより、OS Xでenvsubstが有効になり、強制的に適切にリンクされます。自作がインストールされている必要があります。
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... wtf 194シンボリックリンク?
gettext
、地獄がたくさんあります。envsubst
インストールするだけではやり過ぎのようですが、これが最も早くて簡単な方法です。
潜在的な混乱を解消するには:
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
私は今、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
"
$ lineを追加してみることもできますが、まだ試していません
envsubst
gettext
パッケージに含まれています。自分でコンパイルできます。stackoverflow.com/questions/14940383/…を