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 prependingexportto 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 intoexports 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.envfile then either don't use it at all or edit it until it can be trusted. – cas Sep 26 '19 at 00:53exportstatements where you need them? – cas Sep 26 '19 at 14:13PATHorLD_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.envfile 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