2012-03-27 206 views
15

Scala REPL的一個有趣功能是,如果您刪除%SCALA_HOME%\lib目錄中的任何jar,則可以從REPL導入。我在那裏有幾個罐子,我經常需要找出哪些罐子可以包括在內。所以我總是需要打開另一個命令窗口並找出該目錄中存在哪些罐子。如果REPL允許我執行系統命令如dirls或者至少列出上述lib目錄中的所有jar,那將是非常好的。在REPL中調用shell命令最簡單的方法是什麼(如果有的話)?從Scala執行shell命令REPL

回答

21

在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 

(不幸的是,有沒有辦法避免的shell命令之前調用cmd \C

類似Unix的版本:

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

更新:靈感來自Daniel's answer,一個小動作對於Windows用戶:

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

scala> "dir".! 
+0

謝謝!這與我所尋找的最接近。 – Jus12 2012-03-27 09:49:37

+0

在Windows上不適用於我: 歡迎來到Scala 2.11.8(Java HotSpot™64位服務器VM,Java 1.8.0_121)。鍵入評估表達式。或嘗試:幫助。 '''階 階>:SH CMD/C DIR RES0:scala.tools.nsc.interpreter.ProcessResult ='CMD/C dir'(27線,出口0) 階> RES0的foreach的println :13:錯誤:值的foreach不是scala.tools.nsc.interpreter.ProcessResult RES0的foreach的println成員 ^ ''' – Hossein 2017-10-27 12:33:41

3

鮮爲人知REPL的絕招:

歡迎斯卡拉版本2.10.0-20120323-101508-45eebcf98d(Java的熱點(TM)64位服務器VM,Java 1.6.0_26)。 輸入表達式來評估它們。 類型:help獲取更多信息。

scala> /home/dcs/scala-2.9.1.final/<TAB> 
/home/dcs/scala-2.9.1.final/misc /home/dcs/scala-2.9.1.final/bin /home/dcs/scala-2.9.1.final/man /home/dcs/scala-2.9.1.final/src /home/dcs/scala-2.9.1.final/lib  
/home/dcs/scala-2.9.1.final/meta /home/dcs/scala-2.9.1.final/doc  

scala> /home/dcs/scala-2.9.1.final/lib/<TAB> 
/home/dcs/scala-2.9.1.final/lib/scala-dbc.jar  /home/dcs/scala-2.9.1.final/lib/scala-swing.jar  /home/dcs/scala-2.9.1.final/lib/jline.jar    
/home/dcs/scala-2.9.1.final/lib/scala-library.jar /home/dcs/scala-2.9.1.final/lib/scala-compiler.jar /home/dcs/scala-2.9.1.final/lib/scalap.jar   

scala> /home/dcs/scala-2.9.1.final/lib/scala-library.jar 
res0: scala.tools.nsc.io.File = /home/dcs/scala-2.9.1.final/lib/scala-library.jar 

哪裏<TAB>是我按標籤

+0

非常酷的把戲!謝謝。 – Jus12 2012-03-27 18:31:54

+0

你可以REPL插入無處不在,「/ ho /dcs/scala-2.9」,或者至少在Linux上就是這樣的情況, – virtualeyes 2012-03-27 22:58:33

16

替代方案:用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 
+0

很酷,但在windows中不是那麼好,就像「dir」等等(以及最有用的命令)不是單獨的文件,而是嵌入在shell解釋器中。 – Jus12 2012-03-27 18:33:28

+0

我已經更新了我的答案,爲Windows用戶構建了一些可口的東西 – Nicolas 2012-03-27 18:47:50

+2

@ Jus12對他們使用'cmd'。問題是關於從REPL執行shell命令,實際的問題是列出文件。我給每個解決方案。 :-) – 2012-03-27 18:48:59

4

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

UPDATE 2018年1月15日

例如:你想看看在當前工作目錄下的文件:

scala> :sh ls -l 
res3: scala.tools.nsc.interpreter.ProcessResult = `ls -l` (13 lines, exit 0) 

但你不能做到這一點:

scala> res3.foreach {println} 
<console>:40: error: value foreach is not a member of scala.tools.nsc.interpreter.ProcessResult 
     res3.foreach {println} 
      ^

首先,您必須將行分配給支持迭代的另一種類型:

scala> res3.lines 
res7: List[String] = List(total 960, [email protected] 1 dave staff 11325 Jan 3 15:01 LICENSE, [email protected] 1 dave staff 8859 Jan 3 15:01 README.rst, [email protected] 3 dave staff  96 Jan 3 15:03 assembly, [email protected] 20 dave staff  640 Jan 3 15:01 bin, [email protected] 13 dave staff  416 Jan 3 15:01 doc, [email protected] 7 dave staff  224 Jan 3 15:01 docker, [email protected] 6 dave staff  192 Jan 3 15:03 examples, [email protected] 1 dave staff  826 Jan 3 15:01 gradle.properties, [email protected] 1 dave staff  128 Jan 3 15:04 h2o_drivers.txt, drwxr-xr-x 3 dave staff  96 Jan 16 00:54 h2ologs, [email protected] 5 dave staff  160 Jan 3 15:04 py, [email protected] 1 dave staff 455890 Sep 19 04:18 rsparkling.tar.gz) 

然後迭代,瞧!

scala> res7.foreach {println} 
total 960 
[email protected] 1 dave staff 11325 Jan 3 15:01 LICENSE 
[email protected] 1 dave staff 8859 Jan 3 15:01 README.rst 
[email protected] 3 dave staff  96 Jan 3 15:03 assembly 
[email protected] 20 dave staff  640 Jan 3 15:01 bin 
[email protected] 13 dave staff  416 Jan 3 15:01 doc 
[email protected] 7 dave staff  224 Jan 3 15:01 docker 
[email protected] 6 dave staff  192 Jan 3 15:03 examples 
[email protected] 1 dave staff  826 Jan 3 15:01 gradle.properties 
[email protected] 1 dave staff  128 Jan 3 15:04 h2o_drivers.txt 
drwxr-xr-x 3 dave staff  96 Jan 16 00:54 h2ologs 
[email protected] 5 dave staff  160 Jan 3 15:04 py 
[email protected] 1 dave staff 455890 Sep 19 04:18 rsparkling.tar.gz