環境変数の値をファイルに保存する最も安全な方法

環境変数の値をファイルに保存する最も安全な方法

私はbash答えを使用しており、最も興味がありますが、必要に応じてbash他のシェルでこれを行う方法に答えることができます。

環境変数があり、KEYその環境変数の値をファイルに保存したいと思います。現在私はやっています

echo "${KEY}" > ./key.pem

実際には大丈夫に見えますが、理論的にはKEY=-n

$ export KEY=-n
$ echo BEGIN "${KEY}" END
BEGIN -n END
$ echo "${KEY}" END
END$

もしそうなら、単一の環境変数の値をファイルに保存するより良い方法はありますか? (exportそしてdeclare出力に変数名が含まれているので、私には何の利点もありません。)

答え1

bash後で(スクリプトで)読み取り用に保存した場合は、declare -p KEYファイルを再度読み取るにはを使用します。値だけを保存したい場合は、printf '%s\n' "$KEY"変数データを出力するのと同じ方法で使用してください。

だから、

printf '%s\n' "$KEY" >key.pem

または

printf 'BEGIN %s END\n' "$KEY" >key.pem

または出力する必要があるすべて。

-ninの有効なオプションが原因で問題が発生します。同じ理由で、文字列の合計(およびそのような組み合わせ)も問題を引き起こす可能性があります。引数のバックスラッシュ文字は、ビルド方法、環境、またはオプションによっても問題になる可能性があります。echobash-e-E-neEnebashbash

次のQ&Aには、これらの質問とその他の事項がまとめられています。

答え2

多くのシステムには、printenv与えられた環境変数の内容と改行文字を標準出力として印刷するコマンドがあります(printenv1970年代後半に3BSDに登場):

printenv 'My Env Var' > file

My Env VarNLの後に続く変数の内容は、これらのシステムのすべてのシェルに保存されます。file

シェル変数にマップされる環境変数(少なくとも名前がASCII文字またはアンダースコアで始まり、後にゼロ文字以上のASCII文字、数字、またはアンダースコアが続くシェルで設定された他の特殊変数ではない変数)の場合、Bourne-シェルと同様に(適用fish)以下のコマンドを使用して同じことを実行できます。

printf '%s\n' "$ENVVAR" > file

(変数を設定しなくても空白行は保存され続けますfile。)

rcシェルに似ている場合(すべてのシェル変数は環境変数にマップされます):

printf '%s\n' $ENVVAR > file
printf '%s\n' $'My Env Var' > file

(上記のような警告)

cshクラスシェルから:

printf '%s\n' $ENVVAR:q > file

(変数が設定されていない場合は失敗し、オーバーライドされません。file

一部の実装/バージョンには組み込まれてkshいません。printfこの中で、次のこともできます。

print -r -- "$ENVVAR" > file

関連情報