Java 为什么ls~或ls$HOME未在过程中工作?

Java 为什么ls~或ls$HOME未在过程中工作?,java,scala,shell,Java,Scala,Shell,我使用Process来调用shell(zsh),我想要cd~,或者其他一些dir,比如shell中定义的cd$PROJ_ROOT。但这些代币似乎无法处理。 如何解决这个问题 scala> import scala.sys.process._ import scala.sys.process._ scala> "ls ~".!! ls: ~: No such file or directory java.lang.RuntimeException: Nonzero exit valu

我使用Process来调用shell(zsh),我想要cd~,或者其他一些dir,比如shell中定义的cd$PROJ_ROOT。但这些代币似乎无法处理。 如何解决这个问题

scala> import scala.sys.process._
import scala.sys.process._

scala> "ls ~".!!
ls: ~: No such file or directory
java.lang.RuntimeException: Nonzero exit value: 2
  at scala.sys.package$.error(package.scala:27)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:132)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:102)
  ... 33 elided
波浪形展开(以及全球化、参数展开等)由shell执行。运行该进程不会调用shell,因此不会执行替换

实现这一点的唯一方法是自己调用shell:

Seq("/bin/sh", "-c", "ls ~").!!

编辑:我最初的建议
“/bin/sh-cls~”
实际上不起作用,因为它总是列出当前目录并忽略tilde参数。将命令行按如上所示的顺序拆分似乎是实现这一点的安全方法。

您可以使用
System.getenv(“YOURVAR”)
访问环境变量,因此在您的用例中,您可以这样做

scala> import scala.sys.process._
import scala.sys.process._

scala> val home = System.getenv("HOME")
home: String = /home/user1

scala> s"ls $home".!!
val res0: String = ....

因为这些都是由shell处理的,而您没有使用shell。哈哈,谢谢。我想在阅读您的答案之前,我必须使用System.getenv阅读这些信息。