Linux上的ruby脚本中的环境变量

时间:2015-12-14 10:12:34

标签: ruby linux bash shell

我的一台服务器上有一个简单的ruby脚本可以做一些事情(对于这个问题并不相关)。它有时直接从命令行运行,有时来自cron作业执行的bash脚本,有时也是fail2ban操作的结果。

该脚本使用环境变量(假设FOO=bar)并使用dotenv gem通过将FOO=bar放入项目中的.env文件来加载它。

但是,在某些情况下,环境变量未加载导致脚本失败,特别是当脚本由自动进程或bash脚本执行时,而不是直接运行它。

例如,脚本中只包含以下内容(并且.env文件存在且已填充):

#!/usr/bin/env ruby
require 'dotenv'
Dotenv.load
puts ENV['FOO']

我跑/path/to/myscript.rb。它输出'bar'。

但是,如果我将行/path/to/myscript.rb放在test.sh文件中并运行./test.sh则不输出任何意味着没有加载.env。如果我在ruby调用之前使用export FOO="bar",那么它将按预期工作。

如何确保根据需要加载.env变量?

1 个答案:

答案 0 :(得分:2)

.env文件是从项目的根目录加载的。特别是在你的情况下从当前目录。在执行脚本之前,请尝试进入包含.env文件的目录。

cd /path/to/ && ./myscript.rb

<强>更新

您可以从脚本路径加载.env文件而不移动它:

config = File.absolute_path(File.join(File.expand_path(__FILE__), '..', '.env'))
Dotenv.load(config)