次のファイルがあるとしましょう.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
シェルの組み込みコマンドではなく、スタンドアロンの実行可能ファイルのみを実行できるためです。export
xargs
引用符なしのシェル$(...)
構成自体は、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
。)