私は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
または出力する必要があるすべて。
-n
inの有効なオプションが原因で問題が発生します。同じ理由で、文字列の合計(およびそのような組み合わせ)も問題を引き起こす可能性があります。引数のバックスラッシュ文字は、ビルド方法、環境、またはオプションによっても問題になる可能性があります。echo
bash
-e
-E
-neEne
bash
bash
次のQ&Aには、これらの質問とその他の事項がまとめられています。
答え2
多くのシステムには、printenv
与えられた環境変数の内容と改行文字を標準出力として印刷するコマンドがあります(printenv
1970年代後半に3BSDに登場):
printenv 'My Env Var' > file
My Env Var
NLの後に続く変数の内容は、これらのシステムのすべてのシェルに保存されます。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