値にスペースが含まれる環境ファイルから変数をエクスポートする

値にスペースが含まれる環境ファイルから変数をエクスポートする

次のファイルがあるとしましょう.env

A=1
B=2
C="3 4 5"

私が実行した場合set -x; echo $(cat .env | xargs)

++ cat .env
++ xargs
+ echo A=1 B=2 C=3 4 5
A=1 B=2 C=3 4 5

私が実行した場合set -x; export $(cat .env | xargs)

++ cat /tmp/test.env
++ xargs
+ export A=1 B=2 C=3 4 5
+ A=1
+ B=2
+ C=3
bash: export: `4': not a valid identifier
bash: export: `5': not a valid identifier

Cその後、値の周りに引用符を保持または追加するためにいくつかの異なるトリックを試しました。

$ set -x; export $(cat /tmp/test.env | xargs printf %q)
+ set -x
++ cat /tmp/test.env
++ xargs printf %q
+ export ''\''A=1'\'''\''B=2'\'''\''C=3' 4 '5'\'''
bash: export: `'A=1''B=2''C=3': not a valid identifier
bash: export: `4': not a valid identifier
bash: export: `5'': not a valid identifier

何をしても、C値は常にスペースで分割されています。

編集:明確にするために.envファイルを素早く調達することに基づくソリューション(ほとんどのソリューションはファイルから変数をエクスポートするには?)ファイルに実行するコマンドとして解釈できる文字列が含まれている場合、それは非常に安全ではありません。私の環境ファイルをキー値データとして解釈したいだけです。

答え1

あなたはそれを使用できますかparset

parset "`perl -nE '/[^=]+/ && print "$&,"' .env`" echo ::: "`perl -pe 's/[^=]+=//' .env`"

次のように入力をシームレスに処理できます。

vv=* ;   & " echo this is a value - not a command

答え2

xargs引用符は実際には理解されていますが(POSIXシェルとまったく同じ方法ではありませんが)実行はxargs export機能しません。たとえば、通常は組み込まれていないxargsシェルの組み込みコマンドではなく、スタンドアロンの実行可能ファイルのみを実行できるためです。exportxargs

引用符なしのシェル$(...)構成自体は、IFS分割+ワイルドカード(後者ではないzsh)を実行し、引用符を処理しません(そしてここではワイルドカード部分を望まない)。

ただし、シェルがあるため、bashファイルから読み取ったレコードを呼び出してNULで区切られたレコードを出力し、分割xargs+glob演算子を使用してbash(bash 4.4+が必要)から分割できます。printf '%s\0'readarray -td ''-d

readarray -td '' assignments < <(xargs -r < .env printf '%s\0')
(( ${#assignments[@]} == 0 )) || export -- "${assignments[@]}"

(ここでは、入力が記録されていないときに実行されるのを防ぐためにGNUスタイルの-rオプションが使用されますprintf。)

関連情報