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