【问题标题】:How to export environment variable permanently using Ruby?如何使用 Ruby 永久导出环境变量?
【发布时间】:2022-01-09 23:23:08
【问题描述】:

我是 Ruby 新手,想将环境变量永久导出到主机系统。

现在我正在使用以下 ruby​​ 脚本。在此脚本中,有一个 ENV 命令将 URL env var 添加到当前执行环境中,并且工作正常。但是我想让这个改变持久化到主机,在我的例子中是它的 linux。 我该怎么做?

require 'singleton'

java_import com.test.TestClass;
class RubyClient
  include Singleton

 def initialize
  ENV['URL'] = 'http://localhost'
 end
end

def test_client
  puts TestClass.getEnv
end

class TestClass{
 public String getEnv({
  return StringUtils.trimToNull(System.getenv("URL"));
 }
}

【问题讨论】:

  • 你没有;这将是一个巨大的潜在安全风险。你能做的最好的事情是修改一个 shell 启动配置(如果你的脚本可以写入适当的文件)。更大的问题是你为什么要这样做——这似乎是一个 XY 问题。
  • 我同意@DaveNewton。您可能希望将您的 URL 作为参数传递给某个类初始化程序或方法,或者使其成为模块级常量。环境变量更常被用作覆盖;它们不是在 Ruby 应用程序中传递数据的正确方法。
  • @DaveNewton,托德,不知何故我也同意这一点。我在这里添加了几行代码。所以完整的场景是,这个 ruby​​ 将导出 var,这个 var 将被 JRuby java 类使用。现在 ruby​​ 将其导出到当前 shell 中,并且它对 java 类不可见。我不能直接将 URL 传递给类。这是我的限制。
  • 它只是不能那样工作;您可以在子进程中运行需要环境变量的 Java 代码(这看起来很麻烦),或者使用更灵活的配置机制启动 JRuby 代码。
  • 正如我所提到的,不要使用 ENV 数组来设置值。将它们设置为可以被 ENV 变量覆盖的实例变量或常量,并将它们传递给您的 Java 方法,或者让它们从配置文件中读取。如果使用 RSpec,您还可以在测试中使用 #let 语句设置值。

标签: ruby environment-variables


【解决方案1】:

使用 Direnv 或 Dotenv

这不是环境变量的工作方式。您在当前 shell 中导出它们,它们由子 shell 继承。您不能真正将变量从子 shell 导出回父 shell。

有一些工具让你看起来可以做到这一点(例如 direnv),但如果你想将一个值读入父 shell,你需要确保 shell 在每个命令之前从磁盘读取存储的值.从实用的角度来看,挂接到您的 shell 中的 Direenv 或 dotenv 将完成此操作,但父 shell 本身永远不会真正继承自子 shell。

【讨论】:

  • 当你说 subshel​​ls 继承环境变量时。所以在我的情况下,Jruby 仅由 ruby​​ 触发。所以理想情况下,Jruby 进程只不过是 ruby​​ 子进程,它应该在运行时而不是在启动时看到在 ruby​​ env 中设置的变量。或者我们可以认为当 ruby​​ 触发 Jruby 执行时,我们可以在它的生命中添加一些钩子。
  • 我不认为 Dotenv 真的在 2021 年的工具链中占有一席之地,最好使用 Direv(或任何其他与语言无关的选项)或加密的秘密(是的,它可以作为Rails) 或在 docker 容器中进行配置。
【解决方案2】:

这是不可能的。环境变量适用于当前运行的进程,适用于当前进程。由该进程启动的子进程最初将继承其父进程的环境,但可以(并且经常这样做)用自己的环境覆盖它。

一个进程不能改变另一个进程的环境。这与 Ruby 或 Java 无关,这是所有 Unices 以及许多其他具有类似“环境”概念的操作系统的基本安全属性。

【讨论】:

    【解决方案3】:

    你不应该这样设置环境变量,你只能阅读,这是一种配置。 您可以从 gem dotenv 获得帮助。

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 2018-09-15
      • 1970-01-01
      • 2010-10-29
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多