首页 > 解决方案 > 如何在 Scala 中获取 .bashrc / .profile 变量

问题描述

我无法从 Scala 访问 ~/.bashrc 或 ~/.profile 中的环境变量。如何从 Scala 进程访问环境变量?我也无法像这样更新路径:

Process("myProgram", None, "PATH"-> ".:/path/to/myProgram").!!

但是,这有效:

Process("/path/to/myProgram",None).!!

工作正常。但是,当 myProgram 依赖于设置的某些环境变量时,这将不再起作用。

  1. 如何从 Scala 程序中更改 PATH 变量?
  2. 更好的是,如何让 Scala 从 .bashrc 或 .profile 访问环境变量。目前这些都不可用。

感谢您的时间和帮助

标签: scala

解决方案


如何从 Scala 进程访问环境变量?

util.Properties对象提供了 3 种不同的方法来检查 Scala 进程/程序继承的环境变量。这是一个例子:

util.Properties.envOrNone("LC_COLLATE")
//res0: Option[String] = Some(POSIX)

如何从 Scala 程序中更改 PATH 变量?

一个正在运行的进程不允许改变它自己的环境,但它可以启动一个修改了环境的新进程。有几种不同的方法可以解决这个问题。

一种是在调用目标命令之前启动您选择的 shell 并使用 shell 语法进行修改。

import sys.process._
Seq("sh", "-c", "PATH=$PATH:$HOME/Progs myProg").!!
// a single arg:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

或者,您可以将环境 mods 作为参数提供给众多重载Process.apply()方法之一。

import scala.sys.process._
Process("./myProg"
       ,new java.io.File("/full/path/to")
       ,"PATH"->s"${Properties.envOrElse("PATH",".")}:/full/path/to"
       ).!!

...我可以让 Scala 从.bashrcor访问环境变量.profile吗?

如果您的 Scala 程序是从具有适当环境的 shell 启动的,那么从您的程序启动的每个进程都应该继承相同的。如果,无论出于何种原因,您的程序没有继承一个设备齐全的环境,那么最简单的方法就是启动一个设备齐全的 shell 来启动目标命令。

import scala.sys.process._
Seq("sh", "-c" , ". $HOME/.bashrc && myProg").!!

推荐阅读