【问题标题】:Accessing environment vars from Ruby using a .env (dotenv) file in zsh使用 zsh 中的 .env (dotenv) 文件从 Ruby 访问环境变量
【发布时间】:2017-10-08 06:21:32
【问题描述】:

我正在使用 oh-my-zsh dotenv plugin,它会加载 .env 文件(如果存在),每当我将 cd 加载到项目目录时。

我知道它有效,因为我可以在运行 set cmd 时看到我的自定义环境变量设置。

我也可以从命令行回显我的自定义环境变量:

$ echo $FOO
'foo'

但是,我无法通过 env 命令或 Ruby 访问此环境变量:

$ irb
2.4.1 :001 > ENV['FOO']
nil

如何确保从我的.env 加载的环境变量可以从 Ruby 访问?

【问题讨论】:

  • 如果你require 'dotenv/load' 可以吗?
  • 我没有使用 dotenv gem(只是 oh-my-zsh 插件),因为我认为 shell 插件会自动导出变量。
  • 应该的。您是否尝试过运行 export FOO=test 然后 irb: ENV['FOO'] ?这适用于 Mac OS 上的 iTerm2。
  • 如果我手动导出,那么可以。我在看this SO post,我认为问题是变量只是本地shell,env 看不到。但我不确定如何解决这个问题。
  • 您是否有不想使用 gem 的特殊原因?如果.env 在工作目录中,它将起作用。在 ruby​​ 程序中依赖 zsh 功能似乎很奇怪。您可以轻松地从 repo 中排除您的 .env 文件

标签: ruby environment-variables zsh


【解决方案1】:

documentation of dotenv 中所述相反,您实际上需要在.env 文件中使用export 关键字才能使参数可用于环境,例如

export FOO=foo

唯一的例外是,如果参数已经是环境变量。例如,如果它已在~/.zshrc 中导出,或者它已经是zsh 启动时获得的环境的一部分(例如PATHHOME)。


所有dotenv 所做的都是在切换到目录时自动获取任何.env 文件。没有额外的“魔法”。这意味着.env 必须是一个有效的zsh 脚本,并且它的内容在当前shell 会话的上下文中运行(基本上就像您手动键入它一样)。

这也意味着通常的规则适用。也就是说,仅设置参数使它们仅可用于当前 shell 上下文。为了使它们可用作环境变量,它们需要被导出(在设置之前、期间或之后)。所以除非之前已经导出了一个参数,否则export.env 中并不是真正的“可选”。

【讨论】:

  • 是的。将export 添加到我的.env 文件解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2015-12-10
  • 2020-07-30
  • 2021-02-19
  • 2021-10-14
  • 1970-01-01
  • 2020-12-29
  • 2019-12-21
  • 2021-11-05
相关资源
最近更新 更多