如何从Scala设置环境变量?

如何从Scala设置环境变量?,scala,Scala,我需要从Scala设置环境变量(PATH) 我试过这个: val cmd = Seq("export", "PATH='bla'") cmd.lines 但我有一个错误: java.io.IOException: Cannot run program "export": error=2, No such file or directory at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041) at scala.sys.proce

我需要从Scala设置环境变量(PATH)

我试过这个:

val cmd = Seq("export", "PATH='bla'")
cmd.lines
但我有一个错误:

java.io.IOException: Cannot run program "export": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:68)
at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.lines(ProcessBuilderImpl.scala:140)
at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.lines(ProcessBuilderImpl.scala:106)
at .<init>(<console>:12)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:914)
at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:546)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:577)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:543)
at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:694)
at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:745)
at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:651)
at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:542)
at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:550)
at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:851)
at xsbt.ConsoleInterface.run(ConsoleInterface.scala:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:73)
at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:64)
at sbt.Console.console0$1(Console.scala:23)
at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24)
at sbt.TrapExit$.executeMain$1(TrapExit.scala:33)
at sbt.TrapExit$$anon$1.run(TrapExit.scala:42)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:135)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
    ... 35 more
java.io.IOException:无法运行程序“导出”:错误=2,没有这样的文件或目录
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
在scala.sys.process.ProcessBuilderImpl$Simple.run处(ProcessBuilderImpl.scala:68)
位于scala.sys.process.ProcessBuilderImpl$AbstractBuilder.lines(ProcessBuilderImpl.scala:140)
位于scala.sys.process.ProcessBuilderImpl$AbstractBuilder.lines(ProcessBuilderImpl.scala:106)
在。(:12)
在
在。(:11)
在
$print()
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
在scala.tools.nsc.explorer.IMain$ReadEvalPrint.call中(IMain.scala:704)
位于scala.tools.nsc.explorer.IMain$Request.loadAndRun(IMain.scala:914)
位于scala.tools.nsc.explorer.IMain.loadAndRunReq$1(IMain.scala:546)
位于scala.tools.nsc.explorer.IMain.explore(IMain.scala:577)
在scala.tools.nsc.explorer.IMain.explore(IMain.scala:543)中
在scala.tools.nsc.interpreter.ILoop.reallyexploration$1(ILoop.scala:694)
位于scala.tools.nsc.interpreter.ILoop.interpretatingstartingwith(ILoop.scala:745)
位于scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:651)
位于scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:542)
位于scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:550)
位于scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
位于scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:851)
运行(ConsoleInterface.scala:57)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
在sbt.compiler.AnalyzingCompiler.call中(AnalyzingCompiler.scala:73)
在sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:64)
在sbt.Console.console0$1(Console.scala:23)
在sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24)
在sbt.TrapExit$.executeMain$1(TrapExit.scala:33)
在sbt.TrapExit$$anon$1.run(TrapExit.scala:42)
原因:java.io.IOException:error=2,没有这样的文件或目录
位于java.lang.UNIXProcess.forkAndExec(本机方法)
位于java.lang.UNIXProcess(UNIXProcess.java:135)
在java.lang.ProcessImpl.start(ProcessImpl.java:130)
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
... 35多

还有其他方法吗?

文档中的示例,用于
sys.process.process

apply("java", new java.ioFile("/opt/app"), "CLASSPATH" -> "library.jar")
编辑以获得更有用的措辞:

也就是说,在生成子进程时指定env

当前进程的环境是只读的;请参阅
System.getenv
,或者比较抽象的
sys.props
sys.env

shell使用导出的变量来增强它赋予子shell的环境,这是一个shell约定。参见bash参考中的3.7.4,例如:

调用时,shell扫描自己的环境并创建 参数,自动将其标记为导出到 子进程。执行的命令继承环境。出口 和“declare-x”命令允许添加参数和函数 从环境中删除或删除。如果参数的值在 修改环境后,新值将成为 环境,取代旧的。任何人所继承的环境 执行的命令由shell的初始环境组成,其 可以在shell中修改值,减去由 unset和“export-n”命令,以及通过export和 “declare-x”命令


这是我的答案第一次比重复的长

“导出”不是可执行文件,它是一个shell内置命令。如果您试图在父shell中设置路径,那么,您不能。您可以为执行的新shell设置它。这实际上更像是一个unix常见问题。

您是在尝试使用属性集从Scala启动另一个进程,还是在Scala程序退出后尝试使属性保持不变?重复的,其答案与下面的一样简单。