如何在破折号中获取 dotenv (.env) 文件?

How to source a dotenv (.env) file in dash?

这里有很多示例如何在 bash 中获取 dotenv 文件,但有没有人有一种方法可以使用 dash(这是最小 Debian 安装的默认设置 shell )?

解决方案应如下所示:

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

例如

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

重要的是,该解决方案支持带有空格的多行值,例如:

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

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

SPECIAL="foo#bar"

看来您的问题不在于您正在使用 dash,而是您想要支持 \n 转义。以下适用于 dash 并支持 \n 转义:

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

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

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

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

一些技术说明:

$(cat .env)

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

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

通过 env 调用 echo -e 来扩展反斜杠转义,而不管当前 shell。双引号禁用字段拆分,以便保留换行符。