envsubst
入力で宣言された環境変数を置き換えることを知っています。
$ echo 'Hello $USER' | envsubst
Hello myusername
envsusbst
私が望むのは、環境変数が存在する場合はそれを置き換え、変数文字列はそのままにする方法(または他のコマンド)です。私が得るものは次のとおりです。
$ echo 'Hello $USER $UNDEFINED_VARIABLE' | envsubst
Hello myusername
私が望むもの:
$ echo 'Hello $USER $UNDEFINED_VARIABLE' | somecommand
Hello myusername $UNDEFINED_VARIABLE
ベストアンサー1
$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