Say I have this .env
file:
A=1
B=2
C="3 4 5"
If I run 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
If I run 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
Then I tried a lot of other tricks to try and keep or add quotes around the C
value:
$ 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
No matter what I do, the C
value is always split on spaces.
Edit: To clarify, a solution based on naively sourcing the .env file(most solutions from How to export variables from a file?) is severely unsafe, if the file contains any string that can be interpreted as command executon. I want my environment files to be interpreted only as key-value data.
. .env
? – Arkadiusz Drabczyk Sep 24 '19 at 14:44. <(sed -E -n '/^\s*[[:alpha:]_][[:alnum:]_]*=/ s/^/export /p' < .env)
. The sed command adds "export " to the beginning of lines that look like a valid variable assignment, and drops all other lines from the output. there's bound to be all sorts of horrible failure modes with unexpected input, but it's OK-ish as a quick and dirty hack. – cas Sep 25 '19 at 04:24set -a; . ./.env; set +a
(as in the answer I've deleted because you "don't want to source.env
") is much safer than prependingexport
to each line and then sourcing it. If you want your file to be "simply key-value" then please clearly define its syntax, especially how values containing newlines, quotes, other metacharacters etc are supposed to be represented. – Sep 25 '19 at 19:26. <(sed -E -n 's/^\s*([[:alpha:]_][[:alnum:]_]*)=.*/export \1/p' < .env)
which just transforms the variable assignments intoexport
s without the assignment. – cas Sep 26 '19 at 00:52export $(cat | xargs)
is to reinventeval
, which is no safer than source. If you don't/can't trust your.env
file then either don't use it at all or edit it until it can be trusted. – cas Sep 26 '19 at 00:53export
statements where you need them? – cas Sep 26 '19 at 14:13PATH
orLD_PRELOAD
; and that's just the beginning 3. Any ad-hoc "parsing" will break sooner or later in dangerous and ridiculous ways; think of eg. a.env
file as generated byprintf 'key="val\nfoo=bar"\nquux=baz\n'
. That's more likely to happen than some evil haxxor trying her hand at you. – Sep 26 '19 at 19:27