env を使用できます 現在定義されているすべての環境変数を表示し、そのリストを使用してそれらのみを置き換えます。 (man ページはそれについてあまり明確ではありませんが、説明についてはこの回答を参照してください。)
echo 'Hello $USER $UNKNOWN' | envsubst "$(env | cut -d= -f1 | sed -e 's/^/$/')"
( env の出力 変数の値もリストしますが、 envsubst 先頭の $ も見たい 、だから cut -d= -f1 だけを使うことはできません 残念ながら、それ自体で。単一の sed を使用できます cut をする の仕事でもあります。以前のリビジョンを参照してください。ただし、cut の明快さが好みです わずかなパフォーマンスの向上よりも。)
$USER$PATH のような引数を渡す場合 envsubstまで 、その引数で参照されている変数のみを展開します。
したがって、1 つの方法は、現在定義されているすべての環境変数をその形式で渡すことです。 zsh で :
echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
envsubst \$${(kj:$:)parameters[(R)*export*]}
$parameters変数名をその型にマッピングする特別な連想配列です$parameters[(R)*export*]値がexportを含む連想配列のすべての要素に展開されます .kで パラメータ展開フラグ、キー 代わりに値が返されますj:$:これらの要素を$で結合します 間に、最初に 1 つ追加します。
他のシェルでは、いつでも perl に戻すことができます そのリストを取得するには:
echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
envsubst "$(perl -e 'print "\$$_" for grep /^[_a-zA-Z]\w*$/, keys %ENV')"
両方とも環境変数の名前を開示していることに注意してください ps の出力 .
代わりに、すべてを perl で行うこともできます :
perl -pe 's{(?|\$\{([_a-zA-Z]\w*)\}|\$([_a-zA-Z]\w*))}{$ENV{$1}//$&}ge'
同じ制限があることに注意してください envsubst として ${VAR:-x} のようなものを展開しないという点で $HOME を展開します \$HOME のようなもので または $$HOME