如何在短划线中获取dotenv(.env)文件?

时间:2017-08-10 10:45:41

标签: bash environment-variables dash-shell 12factor

这里有很多例子如何在bash中获取dotenv文件,但是有一个方法可以实现与dash相同的方法(这是最小的Debian安装的默认shell)?

解决方案应如下所示:

$ some foo my-command-using-env-vars

e.g。

$ env $(cat .env) my-command-using-env-vars

重要的是,该解决方案支持具有以下空格的多行值:

SSH_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nfoo\nbar\baz"

和引号中的哈希等特殊字符:

SPECIAL="foo#bar"

1 个答案:

答案 0 :(得分:3)

您的问题似乎不是因为您使用dash,而是希望支持\n转义。以下内容适用于dash并支持\n转义:

eval "$(echo $(cat .env))" my-command-using-env-vars

这是因为与bash不同,即使没有echo选项,dash中的内置-e也支持反斜杠转义。如果非内置系统bash支持dash选项,则以下内容适用于echo-e

eval "$(env echo -e $(cat .env))" my-command-using-env-vars

请注意,这两种方法也可以处理其他反斜杠转义(POSIX或GNU),可能与您预期的方式不同。

一些技术说明:

$(cat .env)

执行Field Splitting,将文件.env中的任何换行符转换为空格。

"$(env echo -e ...)"

通过echo -e调用env,无论当前shell如何,都会扩展反斜杠转义。双引号禁用字段拆分,以便保留换行符。