【问题标题】:How to source a dotenv (.env) file in dash?如何在破折号中获取 dotenv (.env) 文件?
【发布时间】:2018-01-18 13:49:03
【问题描述】:

这里有很多示例如何在 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"

【问题讨论】:

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


    【解决方案1】:

    看来你的问题不是你使用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。双引号禁用字段拆分,以便保留换行符。

    【讨论】:

    • 感谢您的解决方案!只是为了好奇,在上述情况下,其他反斜杠转义究竟将如何处理?
    • @BastianVenthur 查看dashbash 手册页并搜索内置命令。对于 env echo,请参见 echo 手册页。
    • echo 在交互式使用你的 shell 时很好,但你不应该在需要可移植的脚本中使用它,因为它的行为在不同的系统中是可变的。相反,printf 非常便携且标准化,因此最好使用它。
    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 2015-08-19
    • 2018-06-05
    • 2015-12-11
    • 2021-02-19
    • 2017-09-06
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多