【问题标题】:Why ls ~ or ls $HOME not working in Process?为什么 ls ~ 或 ls $HOME 不在进程中工作?
【发布时间】:2015-05-05 09:19:34
【问题描述】:

我使用 Process 来调用 shell(zsh),我想 cd ~ 或其他一些目录,比如在 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。

标签: java scala shell


【解决方案1】:

波浪号扩展(以及通配符、参数扩展等)由 shell 执行。运行进程不会调用 shell,因此不会执行替换。

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

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

编辑: 我最初的建议 "/bin/sh -c ls ~" 并没有实际工作,因为它总是会列出当前目录并忽略波浪号参数。将命令行拆分为如上所示的序列似乎是实现此目的的安全方法。

【讨论】:

  • 哈哈,谢谢。我想在阅读您的答案之前,我必须使用 System.getenv 阅读这些信息。
【解决方案2】:

您可以使用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 = ....

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 2010-11-12
    • 2012-12-02
    • 2015-02-05
    • 2016-12-04
    • 2016-11-15
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多