2012-03-27 18 views
15

Scala REPLの興味深い特徴は、%SCALA_HOME%\libディレクトリに任意のjarをドロップすると、REPLからインポートできることです。私はそこにいくつかのジャーを持っています、そして、私はしばしばどのものが含まれているかを知る必要があります。ですから、私はいつも別のコマンドウィンドウを開き、そのディレクトリ内にどのjarファイルが存在するかを調べる必要があります。 REPLが私にdirlsのようなシステムコマンドを実行させたり、上記のlibディレクトリにあるすべてのjarを少なくともリストすることができれば嬉しいです。 REPLでシェルコマンドを呼び出す最も簡単な方法は何ですか? REPLでScalaからシェルコマンドを実行するREPL

答えて

21

:shコマンドシェル・コマンドを導入することができます:

Windows版:

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

(残念ながら、シェルコマンドの前に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

+0

Windows上で動作しません。 Scala 2.11.8(Java HotSpot(TM)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

3

REPLのリトル知らトリック:

ようこそScalaのバージョン2.10.0-20120323-101508-45eebcf98d(Javaのホットスポットに(TM)64ビットサーバVM、Java 1.6.0_26)。 評価するには式を入力します。 タイプ:詳細については、ヘルプを参照してください。 <TAB>は私がタブを押すことで

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 

+0

非常にクールなトリックのメンバーではありません!ありがとう。 – Jus12

+0

あなたはどこでもを挿入することができます。 "/ ho /dcs/scala-2.9 "、または少なくともLinuxの場合 – virtualeyes

16

オルタナティブ:

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

"dir"など(そして最も有用なコマンド)別々のファイルではなく、シェルインタープリターに組み込まれています。 – Jus12

+0

私はWindowsユーザーにとってこれほど美味しいものを作るために私の答えを更新しました – Nicolas

+2

@ Jus12それらのために 'cmd'を使います。問題は、REPLからシェルコマンドを実行することでしたが、実際の問題はファイルをリストすることでした。私はそれぞれに1つの解決策を与えました。 :-) –

4

UPDATE

:sh出力は長年にわたって変更された抽出する手段:Scalaのsys.processライブラリを使用します。

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 
関連する問題