如何在Scala中设置和获取环境变量并在Shell脚本中读取?
Scala环境变量操作:获取、设置及传递给Shell脚本
一、Scala中获取环境变量
Scala直接调用JVM的System.getenv()方法读取环境变量:
- 获取单个环境变量:
val homePath = System.getenv("HOME") println(s"用户主目录: $homePath") - 获取所有环境变量并转为Scala可遍历的Map:
import scala.jdk.CollectionConverters._ val allEnvVars = System.getenv().asScala allEnvVars.foreach { case (key, value) => println(s"$key = $value") }
二、Scala中设置环境变量
注意:Scala运行在JVM上,无法直接修改操作系统的全局环境变量,只能在当前JVM进程内临时修改,或者通过启动子进程时传递自定义变量。
1. 临时修改当前JVM进程内的环境变量
这种修改仅对当前Scala程序生效,退出后失效,且依赖JVM内部实现(不推荐生产环境使用):
import java.lang.reflect.Field import scala.jdk.CollectionConverters._ // 通过反射获取System类的私有env映射 val envField = classOf[System].getDeclaredField("env") envField.setAccessible(true) val envMap = envField.get(null).asInstanceOf[java.util.Map[String, String]] // 添加或修改环境变量 envMap.put("MY_CUSTOM_VAR", "scala_env_value") // 验证 println(System.getenv("MY_CUSTOM_VAR")) // 输出 scala_env_value
2. 启动Shell脚本时传递自定义环境变量
如果要让外部Shell脚本获取Scala中的变量,最可靠的方式是在启动脚本时传递自定义环境变量:
import scala.jdk.CollectionConverters._ // 基于当前系统环境变量,添加自定义变量 val baseEnv = System.getenv().asScala.toMap val customEnv = baseEnv + ("SCALA_PASSED_VAR" -> "hello_from_scala") // 构建进程启动器,传递自定义环境 val pb = new ProcessBuilder("./my_script.sh") pb.environment().putAll(customEnv.asJava) // 启动脚本并等待执行完成 val process = pb.start() val exitCode = process.waitFor() println(s"脚本执行完成,退出码: $exitCode")
三、Shell脚本中获取Scala传递的变量
方式1:直接读取传递的环境变量
假设上面的Scala程序启动了my_script.sh,脚本内可以直接通过变量名访问:
#!/bin/bash echo "Scala传递的变量值: $SCALA_PASSED_VAR"
方式2:捕获Scala程序的输出作为Shell变量
如果Scala程序通过标准输出打印变量值,Shell可以捕获该输出:
Scala程序(VarOutput.scala):
object VarOutput extends App { val myVar = "scala_to_shell" println(myVar) }
Shell脚本:
#!/bin/bash # 运行Scala程序并捕获输出 captured_var=$(scala VarOutput.scala) echo "从Scala捕获的变量: $captured_var"
内容的提问来源于stack exchange,提问作者sai m
相关产品推荐
相关产品推荐

