web-dev-qa-db-ja.com

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

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

50
Andrew

編集:@cobberboyの答えはより正確です。彼に投票してください。

brew install gettext
brew link --force gettext 

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

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

したがって、makeなどの標準ビルドツールまたはhomebrewを使用して、独自にコンパイルできます。

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

71
ymonad
brew install gettext
brew link --force gettext 

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

157
cobberboy

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

  • envsubstexternal実行可能ファイルであり、したがってBashの一部ではありません;外部実行可能ファイルはplatform-dependentであり、どちらが利用可能か、特定の動作およびサポートする特定のオプションの両方の観点から(ただし、 POSIX仕様に基づく共通サブセットがあります)
  • bashに直接組み込まれたコマンドはbuiltinsと呼ばれ、theyallプラットフォームに存在することに依存できます。

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

_type <cmdName>
_

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

  • 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は展開されますShell変数参照too-およびembeddedcommand substitutions、これはeval aを利用するものです- セキュリティ上の懸念
13
mklement0

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
2
iRaS