2012-03-27 25 views
15

Una característica interesante de Scala REPL es que si suelta cualquier jar en su directorio %SCALA_HOME%\lib, está disponible para importar desde REPL. Tengo varios frascos allí, y a menudo necesito saber cuáles están disponibles para ser incluidos. Así que siempre tengo que abrir otra ventana de comandos y averiguar qué archivos existen en ese directorio. Sería genial si el REPL me permitiera ejecutar comandos del sistema como dir o ls o al menos enumerar todos los archivos jar en el directorio lib anterior. ¿Cuál es la forma más fácil (si la hay) de invocar comandos de shell en REPL?Ejecutando comandos de shell desde Scala REPL

Respuesta

21

En REPL el comando :sh le permiten introducir comandos shell:

Windows versión:

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

(por desgracia, no hay manera de evitar la llamada a cmd \C antes de que el comando shell)

Versión tipo Unix:

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

Actualización: Inspirado por Daniel's answer, un pequeño truco para las ventanas de usuario:

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

scala> "dir".! 
+0

¡Gracias!esto es lo más cercano a lo que estaba buscando. – Jus12

+0

No funciona para mí en Windows: Bienvenido a Scala 2.11.8 (Java HotSpot (TM) 64-Bit Server VM, Java 1.8.0_121). Escriba expresiones para la evaluación. O prueba: ayuda. '' 'Scala Scala>: sh cmd/C dir res0: scala.tools.nsc.interpreter.ProcessResult =' cmd/C dir' (27 líneas, salida 0) Scala> res0 foreach println : 13: error: foreach valor no es miembro de scala.tools.nsc.interpreter.ProcessResult res0 println foreach ^ '' ' – Hossein

3

Poco conocido truco de REPL:

Bienvenido a Scala versión 2.10.0-20120323-101508-45eebcf98d (Java HotSpot (TM) servidor de 64 bits VM, Java 1.6.0_26). Escriba las expresiones para que se evalúen. Tipo: ayuda para obtener más información.

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 

Dónde <TAB> es que presionando pestaña.

+0

truco muy fresco! Gracias. – Jus12

+0

puede REPL insertar en todas partes, "/ ho /dcs/scala-2.9 ", o al menos en Linux ese es el caso – virtualeyes

16

alternativa: utilizar la biblioteca de sys.process Scala:

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

bueno pero no tan bueno en windows, como "dir", etc. (y comandos más útiles) no son archivos separados sino que están incrustados en el intérprete de shell. – Jus12

+0

He actualizado mi respuesta para crear algo tan bueno como este para usuarios de Windows – Nicolas

+2

@ Jus12 Use 'cmd' para ellos. La pregunta era sobre ejecutar comandos de shell desde REPL, el problema real era enumerar archivos. Di una solución para cada uno. :-) –

4

ACTUALIZACIÓN

Los medios para extraer :sh de salida ha cambiado con los años.

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

ACTUALIZACIÓN 2018/01/15

Ejemplo: Te gustaría ver los archivos en el directorio de trabajo actual:

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

Pero no se puede hacer esto:

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

Primero debe asignar las líneas a otro tipo que admita la iteración:

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) 

Luego iterar, y listo!

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 
Cuestiones relacionadas