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
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".!
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.
truco muy fresco! Gracias. – Jus12
puede REPL insertar
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
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
He actualizado mi respuesta para crear algo tan bueno como este para usuarios de Windows – Nicolas
@ 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. :-) –
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)
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
- 1. Ejecutando scala REPL desde gradle?
- 2. Ejecutando comandos de shell desde Java
- 3. Groovy ejecutando comandos de shell
- 4. Scala - comandos de shell con tubería
- 5. Cómo ejecutar shell builtin desde Scala
- 6. ¿Iniciar Scala REPL mediante programación?
- 7. Scala REPL en Emacs
- 8. Scala - Inicializar ambiente REPL
- 9. ¿Cómo puedo detectar que emacs-server se esté ejecutando desde un intérprete de comandos de shell?
- 10. ¿Cómo puedo lanzar ipython desde el shell, ejecutando 'python ...'?
- 11. settings.maxPrintString para Scala 2.9 REPL
- 12. Ejecutando un comando de shell desde Node.js sin buffering salida
- 13. Ejecutando Jmeter de forma remota desde la línea de comandos
- 14. ¿Por qué puedo usar una lib de Java desde Scala REPL pero no desde un script?
- 15. Ejecutando múltiples comandos usando Popen.stdin
- 16. Deshágase de newline desde comandos de shell en Ruby
- 17. Quiero ejecutar comandos de shell desde pom.xml de Maven
- 18. Ejecutando múltiples comandos desde un script cmd de Windows
- 19. Ejecutando Scrapy desde una secuencia de comandos: se bloquea
- 20. Emular Force Stop desde ADB/comandos de shell
- 21. ¿Cómo ejecutar comandos de shell desde una aplicación Mac/MacRuby?
- 22. cómo llamar comandos de shell desde Groovy correctamente
- 23. Scala REPL incorporado hereda classpath padre
- 24. C++ Ejecutando comandos CMD
- 25. Ejecutando comandos raíz desde PHP ... ¿Hay una manera segura?
- 26. ¿Cómo recuperar la versión de Scala en REPL?
- 27. ejecutando grep desde GNU make
- 28. Ejecutando py.test desde emacs
- 29. Cómo combinar comandos de shell
- 30. ejecutando un comando como superusuario desde una secuencia de comandos python
¡Gracias!esto es lo más cercano a lo que estaba buscando. – Jus12
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