从Scala REPL执行shell命令

Jus*_*s12 15 scala

Scala REPL的一个有趣特性是,如果您删除%SCALA_HOME%\lib目录中的任何jar ,它可以从REPL导入.我在那里有几个罐子,我经常需要找出哪些罐子可以包括在内.所以我总是要打开另一个命令窗口,找出该目录中存在哪些jar.如果REPL允许我执行系统命令,如这将是巨大dir或者ls,或者至少在名单上面的lib目录下所有的罐子.在REPL中调用shell命令最简单的方法是什么(如果有的话)?

Nic*_*las 23

在REPL中,:sh命令允许您引入shell命令:

Windows版本:

scala> :sh cmd /C dir
  res0: scala.tools.nsc.interpreter.ProcessResult = `cmd /C dir` (28 lines, exit 0)
scala> res0 foreach println
Run Code Online (Sandbox Code Playgroud)

(遗憾的是,没有办法避免cmd \C在shell命令之前调用)

类Unix版本:

scala> :sh ls
  res0: scala.tools.nsc.interpreter.ProcessResult = `cmd /C dir` (28 lines, exit 0)
scala> res0 foreach println
Run Code Online (Sandbox Code Playgroud)

更新:Daniel的回答启发,对Windows用户来说是一个小技巧:

scala> implicit def stringToDosProcess(s: String) =
  scala.sys.process.stringToProcess("cmd /C "+ s)
stringToDosProcess: (s: String)scala.sys.process.ProcessBuilder

scala> "dir".!
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 17

替代方案:使用Scala的sys.process库:

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

scala> "ls /home/dcs/scala-2.9.1.final".!
bin
doc
lib
man
meta
misc
src
res1: Int = 0
Run Code Online (Sandbox Code Playgroud)

  • @ Jus12为他们使用`cmd`.问题是关于从REPL执行shell命令,实际问题是列出文件.我给了每个人一个解决方案.:-) (2认同)

jwv*_*wvh 6

UPDATE

:sh多年来,提取输出的手段发生了变化.

Welcome to Scala 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_91).
Type in expressions for evaluation. Or try :help.

scala> :sh date
res0: scala.tools.nsc.interpreter.ProcessResult = `date` (1 lines, exit 0)

scala> res0 foreach println
<console>:13: error: value foreach is not a member of scala.tools.nsc.interpreter.ProcessResult
       res0 foreach println
            ^

scala> res0.show
<console>:13: error: value show is not a member of scala.tools.nsc.interpreter.ProcessResult
       res0.show
            ^

scala> res0.lines
res3: List[String] = List(Sat Sep 17 19:29:26 PDT 2016)
Run Code Online (Sandbox Code Playgroud)