我的一台服务器上有一个简单的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变量?
答案 0 :(得分:2)
.env文件是从项目的根目录加载的。特别是在你的情况下从当前目录。在执行脚本之前,请尝试进入包含.env文件的目录。
cd /path/to/ && ./myscript.rb
<强>更新强>
您可以从脚本路径加载.env文件而不移动它:
config = File.absolute_path(File.join(File.expand_path(__FILE__), '..', '.env'))
Dotenv.load(config)