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)
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)