使用zsh中的.env(dotenv)文件从Ruby访问环境变量

使用zsh中的.env(dotenv)文件从Ruby访问环境变量,ruby,environment-variables,zsh,Ruby,Environment Variables,Zsh,我使用的是oh my zsh,每当我cd进入项目目录时,它都会加载.env文件(如果存在) 我知道它可以工作,因为当我运行setcmd时,我可以看到我的自定义环境变量集 我还可以从命令行回显自定义环境变量: $ echo $FOO 'foo' 但是,我无法通过env命令或Ruby访问此环境变量: $ irb 2.4.1 :001 > ENV['FOO'] nil 如何确保从我的.env加载的环境变量可以从Ruby访问?与中所述相反,您实际上需要在.env文件中使用export关键字,以

我使用的是oh my zsh,每当我
cd
进入项目目录时,它都会加载
.env
文件(如果存在)

我知道它可以工作,因为当我运行
set
cmd时,我可以看到我的自定义环境变量集

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

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

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

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

与中所述相反,您实际上需要在
.env
文件中使用
export
关键字,以使参数对环境可用,例如

export FOO=foo
唯一的例外是,如果参数已经是一个环境变量。例如,如果它是在
~/.zshrc
中导出的,或者它已经是启动时获得的环境
zsh
的一部分(例如
路径
主页


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


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

如果你
需要'dotenv/load'
,它能工作吗?我没有使用
dotenv
gem(只是oh my zsh插件),因为我觉得shell插件会自动导出变量。它应该。您是否尝试过运行
export FOO=test
,然后运行irb:
ENV['FOO']
?这在Mac OS上的iTerm2中是有效的。如果我手动导出,那么是的,这是有效的。我在看,我认为问题在于vars只是shell本地的,
env
看不到。但我不知道如何解决这个问题。你不想使用宝石有什么特别的原因吗?如果
.env
在工作目录中,它将工作。在ruby程序中依赖zsh功能似乎很奇怪。您可以轻松地从repoYup中排除
.env
文件。将
export
添加到我的
.env
文件解决了该问题。