Scala REPL的一個有趣功能是,如果您刪除%SCALA_HOME%\lib
目錄中的任何jar,則可以從REPL導入。我在那裏有幾個罐子,我經常需要找出哪些罐子可以包括在內。所以我總是需要打開另一個命令窗口並找出該目錄中存在哪些罐子。如果REPL允許我執行系統命令如dir
或ls
或者至少列出上述lib目錄中的所有jar,那將是非常好的。在REPL中調用shell命令最簡單的方法是什麼(如果有的話)?從Scala執行shell命令REPL
回答
在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".!
鮮爲人知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>
是我按標籤。
非常酷的把戲!謝謝。 – Jus12 2012-03-27 18:31:54
你可以REPL插入
替代方案:用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
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)
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
- 1. 從命令行執行Django Shell命令
- 2. 如何從scala REPL執行unix命令「top」?
- 3. 從python執行shell命令
- 4. 從Java執行shell命令
- 5. 從ruby執行shell命令
- 6. 命令執行shell
- 7. 執行shell命令
- 8. Shell命令執行
- 9. 從popen執行命令shell並設置其他命令shell
- 10. 如何從scala腳本執行命令?
- 11. 從shell腳本執行R命令
- 12. 從java執行多個命令shell
- 13. 從node.js在前臺執行shell命令
- 14. 從python腳本執行linux shell命令
- 15. 從Ruby代碼執行shell命令
- 16. 不可能從Makefile執行shell命令
- 17. 從npm命令執行ssh shell腳本
- 18. 從Ruby腳本執行shell命令
- 19. 從MySQL客戶端執行shell命令?
- 20. 從C程序執行shell命令
- 21. 執行命令shell從PHP遠程
- 22. 如何從python執行os/shell命令
- 23. 無法從gnuplot執行shell命令
- 24. Sevlet + Shell命令執行
- 25. 執行shell命令(c)
- 26. RealBasic:執行shell命令
- 27. 執行shell命令org.apache.commons.exec.DefaultExecutor
- 28. Groovy執行shell命令
- 29. PHP shell執行命令
- 30. python:os.system不執行shell命令
謝謝!這與我所尋找的最接近。 – Jus12 2012-03-27 09:49:37
在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