hamsterman
hamsterman

Reputation: 91

How to get .bashrc / .profile variables in Scala

I am unable to get access to the environmental variables in either ~/.bashrc or ~/.profile from Scala. How do I access the environmental variables from a Scala Process? Also I am unable to update the paths like this:

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

However this works:

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

Works fine. However, when myProgram depends on some environmental variables being set this doesnt work anymore.

  1. How do I change the PATH variable from a Scala program?
  2. And even better, how can I get Scala to access the environmental variables from .bashrc or .profile. Currently none of those are available.

Thanks for your time and help

Upvotes: 1

Views: 200

Answers (1)

jwvh
jwvh

Reputation: 51271

How do I access the environmental variables from a Scala Process?

The util.Properties object offers 3 different methods for inspecting the environmental variables that the Scala process/program has inherited. Here's an example:

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

How do I change the PATH variable from a Scala program?

A running process is not allowed to alter its own environment, but it can launch a new process with a modified environment. There are a couple different ways to go about this.

One is to launch the shell of your choice and use shell syntax to make the modifications before invoking the target command.

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

Or you can supply the environment mods as an argument to one of the many overloaded Process.apply() methods.

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

...can I get Scala to access the environmental variables from .bashrc or .profile?

If your Scala program is launched from a shell with the proper environment then every process launched from your program should inherit the same. If, for whatever reason, your program has not inherited a fully equipped environment then the easiest thing to do is to launch a fully equipped shell to launch the target command.

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

Upvotes: 1

Related Questions